Select table name dynamically

I want to create a cursor in which the select statement should be
dynamic:<o:p></o:p>
if @PhoneType = White<o:p></o:p>
Then the select statement should
be as<o:p></o:p>
select
distinct
MODEL_NUM from
Dbo.Apple<o:p></o:p>
if @PhoneType = Black<o:p></o:p>
select
distinct
MODEL_NUM from
Dbo.Samsung<o:p></o:p>
IF @MobileId
IS NOT NULL
         BEGIN
IF @PhoneType =
'white'
SET @SqlStmt
= 'select distinct MODEL_NUM from dbo.Apple'
IF @PhoneType =
'Black'
SET @SqlStmt
= 'select distinct MODEL_NUM from dbo.Samsung'
declare MOBILE
cursor for
select distinct
MODEL_NUM from Dbo.Apple

After a few decades with SQL, my rule of thumb is that you should write no more than five cursors in an entire career. Furthermore, dynamic SQL is how you tell the world you failed at your DDL and architecture, so you have to depend on future random users
to do your job. 
I also see you use if-then-else flow controls in SQL! This is a declarative language. We hate that kind of programming. 
Since you felt exempt from Netiquette and did post DDL, I will guess that the phones are set of entities which have a manufacturer. Putting them in separate tables is a design flaw called “attribute splitting” , much like having  “Male_Personnel” and “Female_Personnel”
instead of a Personnel table with a sex_code column. 
The skeleton for this kind of problem puts all the validation in a single table, thus: 
CREATE TABLE Phones 
 model_nbr VARCHAR (???) NOT NULL,
 manufacturer_name VARCHAR (???) NOT NULL,
 CONSTRAINT Valid_Model_nbr
  CHECK (CASE manufacturer_name 
         WHEN 'Apple' AND model_nbr LIKE '<reg exp>
         THEN 'T'
         WHEN 'Samsung' AND model_nbr LIKE '<reg exp>
         THEN 'T'
         ELSE 'F' END = 'T'),
--CELKO-- Books in Celko Series for Morgan-Kaufmann Publishing: Analytics and OLAP in SQL / Data and Databases: Concepts in Practice Data / Measurements and Standards in SQL SQL for Smarties / SQL Programming Style / SQL Puzzles and Answers / Thinking
in Sets / Trees and Hierarchies in SQL

Similar Messages

  • How to pass the table name dynamically in xml parsing

    Hi All,
    I have created one procedure for parsing xml file which is working perfectly.
    FORALL i IN t_tab.first .. t_tab.last
             INSERT INTO Test_AP VALUES t_tab(i);Now I want to put the table name dynamically+. For that I have added one query and modify above code as follow:-
    I have already declare dml_str varchar2(800) in declaration part.
    Query is as follows:-
    select table_name into tab_name from VERSION_DETAILS where SUBVERSION_NO=abc;  -- here abc is variable name which contains values.
    FORALL i IN t_tab.first .. t_tab.last
              dml_str := 'INSERT INTO ' || tab_name || ' values :vals';
              EXECUTE IMMEDIATE dml_str USING t_tab(i);But it's not working. How I will resolve this or through which way I achieved the intended results. Anyone can guide me on this matter.
    Thanks in advance for your help...

    Hi,
    But it's not working.Don't you think it would help to give the error message?
    Put the assignment before FORALL.
    FORALL only accepts one subsequent DML statement (static or dynamic SQL) :
    dml_str := 'INSERT INTO ' || tab_name || ' values :vals';
    FORALL i IN t_tab.first .. t_tab.last          
    EXECUTE IMMEDIATE dml_str USING t_tab(i);

  • Problem in using table name dynamically in PL/SQL

    I tried to create a procedure to use table name dynamically and got the following error. Anything wrong with my procedure?
    NFADV>declare
      2   cnt number;
      3   cursor cur is select table_name from user_tables where table_name in ('EMP','DEPT');
      4  begin
      5   for c1 in cur
      6   loop
      7    execute immediate select count(*) into cnt from c1.table_name;
      8      dbms_output.put_line('Count is : '||cnt);
      9   end loop;
    10  end;
    11  /
    declare
    ERROR at line 1:
    ORA-06550: line 7, column 21:
    PLS-00103: Encountered the symbol "SELECT" when expecting one of the following:
    ( - + case mod new not null <an identifier>
    <a double-quoted delimited-identifier> <a bind variable> avg
    count current exists max min prior sql stddev sum variance
    execute forall merge time timestamp interval date
    <a string literal with character set specification>
    <a number> <a single-quoted SQL string> pipe
    <an alternatively-quoted string literal with character set specification>
    <an alternatively-quo
    ORA-06550: line 8, column 5:
    PLS-00103: Encountered the symbol "DBMS_OUTPUT"
    ORA-06550: line 8, column 45:
    PLS-00103: Encountered the symbol ";" when expecting one of the following:
    . ( , * % & - + / at mod remainder rem <an identifier>
    <a double-quoted delimited-identifier> <an exponent (**)> as
    from into || multiset bulkThanks and Regards
    Kaustubh

    Hi,
    The wrong part is in execute immediate, it should be as follows:
    execute immediate ('select count(*) from '|| c1.table_name)
    into cnt
    (not tested)
    Regards
    AK

  • How to use table name dynamically in report  procedure

    Hello every body
    I want to use table name dynamically means at runtime i want to pass table name.
    I can do this by lexical parameter in main query.
    But my problem is that i want to crate new format trigger or new function that use 1 cursor in which that lexical parameter : table name is used.
    so how to do that?
    i can not use that lexical parameter it is giving error.
    please help me how to do that.

    Call a database function which you pass the lexical parameter. Then in the database function you use dynamic sql or the execute immediate option to build the SQL string.
    Return the information from this function to build your business logic on in your format trigger.
    Marcos

  • How to populate table name dynamically to a ref cursor

    Hi,
    I came accross with a requirement that in ref cursor how can i pass the table name
    for ex
    open ref_cur for select * from emp;Like that i've some 100 tables , instead of typing each and every time the table name
    that should be dynamically changed
    Like below
    open ref_cur for select * from &tbl_nm;How can i do that??
    Thank you

    I assume you are using SQL*Plus:
    SQL> variable ref_cur refcursor;
    SQL> begin
      2      open :ref_cur for select * from &tbl_nm;
      3  end;
      4  /
    Enter value for tbl_nm: emp
    old   2:     open :ref_cur for select * from &tbl_nm;
    new   2:     open :ref_cur for select * from emp;
    PL/SQL procedure successfully completed.
    SQL> print ref_cur
         EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
          7369 SMITH      CLERK           7902 12/17/1980 00:00:00        800                    20
          7499 ALLEN      SALESMAN        7698 02/20/1981 00:00:00       1600        300         30
          7521 WARD       SALESMAN        7698 02/22/1981 00:00:00       1250        500         30
          7566 JONES      MANAGER         7839 04/02/1981 00:00:00       2975                    20
          7654 MARTIN     SALESMAN        7698 09/28/1981 00:00:00       1250       1400         30
          7698 BLAKE      MANAGER         7839 05/01/1981 00:00:00       2850                    30
          7782 CLARK      MANAGER         7839 06/09/1981 00:00:00       2450                    10
          7788 SCOTT      ANALYST         7566 04/19/1987 00:00:00       3000                    20
          7839 KING       PRESIDENT            11/17/1981 00:00:00       5000                    10
          7844 TURNER     SALESMAN        7698 09/08/1981 00:00:00       1500          0         30
          7876 ADAMS      CLERK           7788 05/23/1987 00:00:00       1100                    20
         EMPNO ENAME      JOB              MGR HIREDATE                   SAL       COMM     DEPTNO
          7900 JAMES      CLERK           7698 12/03/1981 00:00:00        950                    30
          7902 FORD       ANALYST         7566 12/03/1981 00:00:00       3000                    20
          7934 MILLER     CLERK           7782 01/23/1982 00:00:00       1300                    10
    14 rows selected.
    SQL> begin
      2      open :ref_cur for select * from &tbl_nm;
      3  end;
      4  /
    Enter value for tbl_nm: dept
    old   2:     open :ref_cur for select * from &tbl_nm;
    new   2:     open :ref_cur for select * from dept;
    PL/SQL procedure successfully completed.
    SQL> print ref_cur
        DEPTNO DNAME          LOC
            10 ACCOUNTING     NEW YORK
            20 RESEARCH       DALLAS
            30 SALES          CHICAGO
            40 OPERATIONS     BOSTON
    SQL> SY.

  • Can we pass IT table name dynamically to READ and SORT stmt

    Hello All,
      i have a requirement in which i am passing table name using a variable and want to read the same table: so my question is can we execute read and sort stmt with dynamic IT name. please see below for explaination.
    v_itname = <it_2>.
    now read using variable
    READ table ( v_itname ) with key <field>.
    and
    SORT ( v_itname ) by (otab).
    thanks
    Mani

    Hi ,
    This can be done. Please refer to the  codes below. Please note that the code will work if the itabs are of type standard table else it may dump.
    You just need to replace the variables form the values from your internal table.
    DATA: v_table1(10) TYPE c VALUE 'I_MARA',
          v_field(10)  TYPE c VALUE 'MATNR',
          i_mara TYPE STANDARD TABLE OF mara.
    FIELD-SYMBOLS : <fs_tab>   TYPE STANDARD TABLE,
                    <fs_field> TYPE ANY.
    DATA: otab TYPE abap_sortorder_tab,
    oline TYPE abap_sortorder.
    SELECT * UP TO 10 ROWS
      FROM  mara
      INTO TABLE i_mara.
    IF sy-subrc = 0.
      ASSIGN (v_table1) TO <fs_tab>.
      IF sy-subrc = 0.
        oline-name = v_field.
        APPEND oline TO otab.
        SORT <fs_tab> BY (otab).
        READ TABLE <fs_tab>
        WITH KEY (v_field) = '000000000020000989' "
        BINARY SEARCH
        TRANSPORTING NO FIELDS.
        IF sy-subrc = 0.
        ENDIF.
      ENDIF.
    ENDIF.
    Regards,
    Dev.

  • Crystal 2008 - Selected table names are blank or end in 1

    I am creating a new report in Crystal 2008.  I am connecting to a database using ODBC.  The tables show up correctly in the available tables column of the Database Expert.  Once I select a table the table shows up in the selected tables list as an icon only - no name or as an icon with a table name ending in 1.  The table name that ends in 1 is not a duplicate.
    Furthermore, in the field explorer the fields all show but I can not add any to the report.
    Any ideas, this just started happening this week.

    Hi Russell
    Which database you are reporting off?
    You can try following workaround and create indirect ODBC connection.
    Create a report using OLEDB connection and select Microsoft OLE DB Provider for ODBC drivers and then create a report .
    This will point to your existing ODBC connection through OLEDB provider.
    For the tables name that are blank do you have hyphen '-' in their names?
    As advised by Jayendra you can try with Service Pack 1for Crysatl Reports 2008.
    Hope this helps..
    Regards
    Ankeet

  • Select table columns dynamically at runtime

    Hi All,
    I've the requirement where user wants to see report columns based on certain parameters.
    Report contains revenue data for range of periods for a transaction, and each period is a column in table (period starting from 01-JAN-2010 to 31-DEC-2020). All the transactions may not start and end at a same period. Now report need to be display only certain columns (periods) based on period range parameter.
    Ex: if trx_123 started in 01-JAN-2011 and ended in 31-MAR-2011 and trx_234 started in 01-FEB-2011 and ended in 31-JUL-2011. now the report output should display in following format.
    Trx Number   period_01-JAN-2011   period_01-FEB-2011   period_01-MAR-2011   period_01-APR-2011   period_01-MAY-2011  period_01-JUN-2011   period_01-JUL-2011
    trx_123                    100                           120                                  180                            
    trx_234                                                       50                                  100                                      80                                 20It should not display all the periods (columns) in table.
    Any suggestion on how to develop this report with dynamic columns (any reporting tool)?
    Thanks in advance!!

    Hi,
    You can do this type of report in Discoverer using a crosstab report. Having period data in separate columns makes this difficult and generally this is not good database design.
    You can get around the problem using a row generator. If you join the data to a row generator so that you have a single column containing the period data and a row for each item of period data then you can use the crosstab report to show only the periods that contain data.
    See this [url http://learndiscoverer.blogspot.com/2008/10/row-generators.html]link for more information on row generators.
    Rod West

  • Dynamically assigning table name in select statement

    how can i assign the table name dynamically in Select statement?
    i tried following code
    create or replace procedure proc1
    as
    x varchar2(100);
    y varchar2(10);
    begin
    x='UNIT_MASTER';
    execute immediate 'select unit_code into y from x where
    rownum=1';
    dbms_output.put_line(y);
    end;
    the procedure is created but when i execute the procedure the
    error is shown in the execute immediate statement

    Do the following :
    Create or replace procedure pro1 as
    x varchar2(100);
    y varchar2(10);
    begin
    x := 'UNIT_MASTER';
    EXECUTE IMMEDIATE 'select unit_code from '||x||' where rownum
    = 1' INTO y;
    dbms_output.put_line(y);

  • Using Table name in Read statement dynamically

    Hi Experts,
    I have the following requirement.
    Based on a country code say "A" , "B", "C" and based on this i have to read different internal tables lt_tabA, lt_tabB and lt_tabC.
    The table key can be given dynamically, but how can i use the internal table name dynamically without using if statements.
    Please help.
    Thanks!
    Best Regards,
    Gayathri

    Hi Gayathri,
    something like
    DATA:
        lt_t100 TYPE TABLE OF t100,
        lt_t000 TYPE TABLE OF t000.
      FIELD-SYMBOLS:
        <table> TYPE table,
        <rec>   TYPE ANY,
        <field> TYPE ANY.
      SELECT:
        * INTO CORRESPONDING FIELDS OF TABLE lt_t100 FROM t100 UP TO 10 ROWS,
        * INTO CORRESPONDING FIELDS OF TABLE lt_t000 FROM t000 UP TO 10 ROWS.
      CASE abap_true.
        WHEN space.
          ASSIGN  lt_t100 TO <table>.
        WHEN OTHERS.
          ASSIGN  lt_t000 TO <table>.
      ENDCASE.
      READ TABLE <table> with key ('MANDT') = sy-mandt ASSIGNING <rec>.
    Regards,
    Clemens

  • Is it possible to make a search help with dynamic  selection table?

    Hi Experts,
    Is it possible to create search helps with dynamic seletion tables means
    i dont know the selection table names at the time of creation of search help.
    These tables will be determined at runtime.
    if yes, Please give an idea how to create and pass the table names at runtime.
    Thanks
    Yogesh Gupta

    Hi Yogesh,
    Create and fill your itab and show it with FM F4IF_INT_TABLE_VALUE_REQUEST
      CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
        EXPORTING
          retfield        = 'field to return from itab'
          dynpprog        = sy-repid
          dynpnr          = sy-dynnr
          dynprofield     = 'field on your screen to be filled'
          stepl           = sy-stepl
          window_title    = 'some text'
          value_org       = 'S'
        TABLES
          value_tab       = itab
        EXCEPTIONS
          parameter_error = 1
          no_values_found = 2
          OTHERS          = 3.
    Darley

  • Create table with dynamic table name.

    I'm trying to create a table
    like
    select x.*,  convert(nvarchar(20), getdate(), 101) AS LoadDate
    into table1_20140512
    from (
           select c1,c2,c3 from table2_20140512
           WHERE(LoadDate = (select MAX(LoadDate) FROM table2_20140512   )
           union all
        select c1,c2,c3 from table3_20140512
          WHERE(LoadDate = (select MAX(LoadDate) FROM table3_20140512  )
    ) X
    I want to make table name dynamic, like 'table1'+toady's date
    I declared three variables, but they didn't work as I expected  
    These are my variables
    DECLARE @table1 nvarchar(500)
    DECLARE @table2 nvarchar(500)
    DECLARE @table3 nvarchar(500)
    SET @table1='H1_' +(CONVERT(VARCHAR(8),GETDATE(),112))
    SET @table2='H2_' +(CONVERT(VARCHAR(8),GETDATE(),112))
    SET @table2='H3_' +(CONVERT(VARCHAR(8),GETDATE(),112))

    Try the following:
    DECLARE @SQL nvarchar(2000);
    DECLARE @table1 nvarchar(500) ='H1_' +(CONVERT(VARCHAR(8),GETDATE(),112));
    DECLARE @table2 nvarchar(500) ='H2_' +(CONVERT(VARCHAR(8),GETDATE(),112));
    DECLARE @table3 nvarchar(500) ='H3_' +(CONVERT(VARCHAR(8),GETDATE(),112));
    PRINT @table1+' '+@table2+' '+@table3;
    --H1_20140512 H2_20140512 H3_20140512
    SET @SQL = 'select x.*, convert(nvarchar(20), getdate(), 101) AS LoadDate
    into '+QUOTENAME(@table1)+'
    from (
    select c1,c2,c3 from table2_20140512
    WHERE(LoadDate = (select MAX(LoadDate) FROM '+QUOTENAME(@table2)+' ))
    union all
    select c1,c2,c3 from table3_20140512
    WHERE(LoadDate = (select MAX(LoadDate) FROM '+QUOTENAME(@table3)+' ))
    ) X '
    PRINT @SQL; -- debugging
    /* select x.*, convert(nvarchar(20), getdate(), 101) AS LoadDate
    into [H1_20140512]
    from (
    select c1,c2,c3 from table2_20140512
    WHERE(LoadDate = (select MAX(LoadDate) FROM [H2_20140512] ))
    union all
    select c1,c2,c3 from table3_20140512
    WHERE(LoadDate = (select MAX(LoadDate) FROM [H3_20140512] ))
    ) X
    EXEC sp_executeSQL @SQL;
    Dynamic SQL examples:
    http://www.sqlusa.com/bestpractices/dynamicsql/
    Kalman Toth Database & OLAP Architect
    SQL Server 2014 Design & Programming
    New Book / Kindle: Exam 70-461 Bootcamp: Querying Microsoft SQL Server 2012

  • How user variable table names in select statement

    Dear all,
    I have three table gp1,gp2,g3. i want user variable table in sql query
    for example at oracle forms have a list table showing table names gp1,gp2,gp3
    at form i want user this query
    select gpno from :table where gpno=120;
    how i can specify table name Dynamicly in select query
    Thanks

    Forms_DDL is a one-way street: You can only pass DDL commands TO the database; you cannot get data back using Forms_DDL.
    Exec_SQL is the Forms package that enables dynamic sql within a form. But to retrieve data, you have to make a Exec_SQL call for every column in every row. So it is not a good thing to use, either.
    The ref cursor method should work. You could also retrieve the data into a record group using populate_group_with_query -- it also enables dynamic data retrieval.
    But if you already know you have three distinct tables and you know their names, I would keep it simple and just write three sql select statements.

  • How to pass dynamically table name in my cursor declaration

    Hi:
    I am new. could you please let me know how to pass a table name dynamically in my cursor declaration? for instance I am declaring the following cursor in my pl/sql procedure:
    CURSOR crs_validate IS
    select * FROM <ACT_JUN_2006_LOB>;
    this ACT_JUN_2006_LOB table name, I should able to pass it when I open the cursor ... any help appreciated. thanks.
    srini

    Thanks all for the response. REFCURSOR does work: here is an example ... which I found on-line
    procedure emp_test(
    month varchar2,
    year varchar2)
    is
    type cur_typ is ref cursor;
    c cur_typ;
    query_str varchar2(200);
    emp_number number := 7900;
    salary number;
    name varchar2(30);
    Begin
    query_str := 'Select empno, ename, sal from emp_' || month ||'_'||year
    || ' where empno = :id';
    open c for query_str using emp_number;
    loop
    fetch c into emp_number, name, salary;
    exit when c%notfound;
    dbms_output.put_line(emp_number);
    end loop;
    close c;
    end;

  • Dynamically pick the table names in data flow task SSIS

    Hi All,
    I want to create a SSIS package which loads the data to a table on the other server every day. I have around 250 tables to load everyday and source and destination table names are available in a metadata table, table names have to read from the metadata
    table and data should be loaded. Is there a way that we can configure the source and destination table names dynamically in Data flow task?
    I am newbie to SSIS can any help with the solution for this problem.

    You can do that, not a big deal. The underlying problem is say suppose you constructed a ETL based on some x source and y destination and have put x(3 columns) as source and y destination(3 columns).. As you said if we have choice of dynamically pick the
    table names.. ETL might fail when you face below situation
    source x(3 columns)   destination y (4 columns) and there will be no mapping as it is dynamic. Sometimes mapping also fails even if the source and destination have same number of columns. If you still want to do... follow below steps:
    Create two variables:
    1.variable1 , datatype string
    2.variable datatype string  
    take one execute sql task, pick your source table names dynamically as you desired from metadata table \
    "SELECT sourcetblname as Res FROM @metadata WHERE ID=1" in sql statement and then go to name the result name as Res (I meant same as table alias) and map it to variablename1
    And in variable2 go to expression and write "Select * from "+@[User::variable].. and this will be your constructed dynamic command for oledb destination.
    And connect that execute sql task to (Data flow task)oledb source and choose data access mode as sql command with variable,and choose variable2. below is the diagram.
    - please mark correct answers

Maybe you are looking for

  • Badi/User Exit for VF01

    Hi Experts, Please understand my issue/requirement that, I have to make the item conditions tab in display or deactivate mode to prevent users to change or create the price or conditions while posting VF01. As std, system allows users to create or ch

  • HELP! I've created a blue movie!

    Just created my first movie using Premier Pro CS5. Just a standard QuickTime DV Pal. As I've done with CS4, I went to File - Export - Media. I set it to QuickTime PAL DV then clicked Export. To my surprise it started rendering without first opening A

  • Oracle 10g- Problem in DB Console

    Hi All, I’m new to the Oracle Domain. My oracle db version is of 10.2.0.1.0, whereas I couldn’t able to open the OEM DB console. Below are the steps that i tried, but I didn’t found the solution: C:\>emca -ddbcontrol db -repos dropeconfig STARTED EMC

  • Query 1 column as 10 columns

    Hi, I've a small problem ... I've 2 tables one holding document information like docnumber, title, creater etc and a second table holding the keywords of the document (cols: docnumber, keyid, keyvalue). I need the value of 10 keywords of a document i

  • Browser compatibility error question by new user

    I''m a new user of CS4, first full website, and am receiving an error that apparently will effect almost every browser (figures!) The error message reads: "Found 1 errors in twoColFixLtHdr.css." The error message refers to line 8. My site is under co