Pasing table name as parameter

hiiii
i have the following PROCEDURE ..
i want the table name in the FROM clause to be (user_table) ... but its not working in the way am using now ... HOW can i do that ??
PROCEDURE LOGIN(u_name varchar2,PWD varchar2,user_table varchar2) IS
nm varchar2(50);
BEGIN
select F_NAME into nm from user_type ;
END;
thanx in advance

hiii
thanx for replying
i used the following
PROCEDURE LOGIN(u_name varchar2,PWD varchar2,user_type varchar2) IS
nm varchar2(50);
BEGIN
execute immediate 'select f_name from ' || user_table into nm;
END;
i got the following error
This feature is not supported in client-side programs
identifier 'USER_TABLE' must be declared
by the way am working on my Graduation Project so i have both(DB & Developer on the same machine)

Similar Messages

  • Pass table name as parameter in prepared Statement

    Can I pass table name as parameter in prepared Statement
    for example
    select * from ? where name =?
    when i use setString method for passing parameters this method append single colon before and after of this parameter but table name should be send with out colon as SQL Spec.
    I have another way to make sql query in programing but i have a case where i have limitation of that thing so please tell me is it possible with prepared Statment SetXXx methods or not ?
    Thanks
    Haroon Idrees.

    haroonob wrote:
    I know ? is use for data only my question is this way to pass table name as parameterI assume you mean "how can I do it?" As I have already answered "is this the way?" with no.
    Well, I would say (ugly as it is) String concatenation, or stored procedures.

  • Dynamic SQL : passing table name as parameter

    Hi
    I have a SQL query (a store procedure )  that i want to convert to PLSQL
    This is a part of my SQL query that i am trying to to find a solution for it, because i cant convert it to oracle :
    DECLARE lookupTableRow CURSOR FOR
      SELECT TableName FROM SYS_LookUpTable
      OPEN lookupTableRow
      FETCH NEXT FROM lookupTableRow INTO @tableName
      WHILE @@FETCH_STATUS=0
      BEGIN
      SET @sql='SELECT * FROM '+@tableName
    EXECUTE sp_executesql @sql
      IF @counter=0
      BEGIN
      INSERT INTO T_TABLE_MAPPING VALUES('P_MAIN_METADATA', 'Table', @tableName)
      END
      ELSE
      BEGIN
      INSERT INTO T_TABLE_MAPPING VALUES('P_MAIN_METADATA', 'Table'+CONVERT(NVARCHAR(10),@counter), @tableName)
      END
      SET @counter=@counter+1
      FETCH NEXT FROM lookupTableRow INTO @tableName
      END
      CLOSE lookupTableRow
      DEALLOCATE lookupTableRow
    As i understand i can't use ORACLE dynamic sql (execute immediate) when the table name is a parameter
    Furthermore when i execute this dynamic query in my SQL store procedure each SELECT statement return me as a result the relevant table rows , those result are different in each loop .
    So i cant do this too with ORACLE dynamic sql .
    Please advice for any solution
    * how can i use dynamic sql with table name as parameter ?
    * how can i use a "dynamic" cursor, in order to be able to display the dynamic results ?
    Thanks for the advice

    Hi,
    b003cf5e-e55d-4ff1-bdd2-f088a662d9f7 wrote:
    Hi
    I have a SQL query (a store procedure )  that i want to convert to PLSQL
    This is a part of my SQL query that i am trying to to find a solution for it, because i cant convert it to oracle :
    DECLARE lookupTableRow CURSOR FOR
      SELECT TableName FROM SYS_LookUpTable
      OPEN lookupTableRow
      FETCH NEXT FROM lookupTableRow INTO @tableName
      WHILE @@FETCH_STATUS=0
      BEGIN
      SET @sql='SELECT * FROM '+@tableName
    EXECUTE sp_executesql @sql
      IF @counter=0
      BEGIN
      INSERT INTO T_TABLE_MAPPING VALUES('P_MAIN_METADATA', 'Table', @tableName)
      END
      ELSE
      BEGIN
      INSERT INTO T_TABLE_MAPPING VALUES('P_MAIN_METADATA', 'Table'+CONVERT(NVARCHAR(10),@counter), @tableName)
      END
      SET @counter=@counter+1
      FETCH NEXT FROM lookupTableRow INTO @tableName
      END
      CLOSE lookupTableRow
      DEALLOCATE lookupTableRow
    As i understand i can't use ORACLE dynamic sql (execute immediate) when the table name is a parameter
    Furthermore when i execute this dynamic query in my SQL store procedure each SELECT statement return me as a result the relevant table rows , those result are different in each loop .
    So i cant do this too with ORACLE dynamic sql .
    Please advice for any solution
    * how can i use dynamic sql with table name as parameter ?
    * how can i use a "dynamic" cursor, in order to be able to display the dynamic results ?
    Thanks for the advice
    I have a SQL query (a store procedure )  that i want to convert to PLSQL
    I doesn't help when you use one term to mean another thing.
    SQL is a language used in both Oracle and other products, such as Microsoft's SQL Server. I don't know much about SQL Server, but Oracle (at least) doesn't support stored procedures in SQL itself; they have to be coded in some other language, such as PL/SQL.  
    As i understand i can't use ORACLE dynamic sql (execute immediate) when the table name is a parameter
    If the table name is a parameter (or only known at run-time for any reason), that's exactly the kind of situation where you MUST use dynamic SQL.
    The number of columns that a query produces (and their datatypes) is fixed when you compile a query, whether that query is dynamic or not.  If you have multiple queries, that produce result sets with different numbers of columns, then you can't combine them into a single query.  The best you can do with one query is to add NULL columns to some of the queries so they all produce the same number of columns.
    If you're just displaying the results, there might not be any reason to combine separate result sets.  Just display one result set after another.
    Whenever you have a question, post a little sample data (CREATE TABLE and INSERT statements, relevant columns only) for all the tables involved, and the results you want from that data.
    Explain, using specific examples, how you get those results from that data.
    Always say what version of Oracle you're using (e.g. 11.2.0.2.0).
    See the forum FAQ: https://forums.oracle.com/message/9362002

  • Passing TABLE NAME as parameter is possible or not?

    I want develop a small/simple report like this
    TABLE NAME :
    WHERE :
    ORDER BY :
    QUERY ROWS
    In the above model i want to pass all the three (TABLE NAME,WHERE and ORDER BY) as a parameter.
    My doubt, is that possible to pass TABLE NAME as a parameter? If so!
    When i enter any TABLE NAME it has to fetch me out the records of that table (Based on WHERE condition and ORDER BY).
    Is that possible to do?
    Need some help!
    Edited by: Muthukumar Seshadri on Aug 10, 2012 6:19 PM

    Yes, it is possible with lexical parameters. Look in the help for examples:
    SELECT Clause
    SELECT &P_ENAME NAME, &P_EMPNO ENO, &P_JOB ROLE  FROM EMP
    P_ENAME, P_EMPNO, and P_JOB can be used to change the columns selected at runtime.  For example, you could enter DEPTNO as the value for P_EMPNO on the Runtime Parameter Form. 
    Note that in this case, you should use aliases for your columns.  Otherwise, if you change the columns selected at runtime, the column names in the SELECT list will not match the Report Builder columns and the report will not run.
    FROM Clause
    SELECT ORDID, TOTAL FROM &ATABLE
    ATABLE can be used to change the table from which columns are selected at runtime.  For example, you could enter ORD for ATABLE at runtime. 
    If you dynamically change the table name in this way, you may also want to use lexical references for the SELECT clause (look at the previous example) in case the column names differ between tables.
    WHERE Clause
    SELECT ORDID, TOTAL FROM ORD WHERE &CUST
    ORDER BY Clause
    SELECT ORDID, SHIPDATE, ORDERDATE, TOTAL  FROM ORD ORDER BY &SORT You have to be really careful with this approach. Dynamic SQL may cause serious performance problems.
    Edited by: InoL on Aug 10, 2012 10:06 AM

  • Table name as parameter to function

    Hi all,
    can anybody help me on the below issue..
    i have a function like this:
    **create or replace**
    **function "IL_SUM_AVG_FN" return number is**
    **cursor c1 is**
    **     select     sum_avg_val value**
    **     from     wel_10_tab**
    **     where     type='1';**
    **v_sum number;**
    **v_count number;**
    **BEGIN**
    **     v_sum:=0;**
    **     v_count:=0;**
    **     for i in c1 loop**
    **          if v_count=0 then**
    **               v_sum:=i.value;**
    **          else**
    **               v_sum:=abs(i.value+v_sum);**
    **          end if;**
    **          v_count:=v_count+1;**
    **     end loop;**
    **     return v_sum;**
    **END;**
    now my requirement is like..i want to pass a value as parameter to the function..say i will pass 10 or11 or 12
    then it should change the table name in the cursor according to the parameter.i.e
    if the parameter is 10 it should be: select sum_avg_val value from wel_10_tab where type='1';
    if the parameter is 11 it should be: select sum_avg_val value from wel_11_tab where type='1';
    if the parameter is 12 it should be: select sum_avg_val value from wel_12_tab where type='1';
    parameter has only these three possible values..
    how to achieve this?
    please help..

    Hi,
    you can do without execute immediate and one cursor is sufficient, if you use open cursor for ...:
    set serveroutput on;
    drop table TestTab1;
    drop table TestTab2;
    create table TestTab1 (
         val number
    create table TestTab2 as (select * from TestTab1 where 0 = 1);
    create or replace procedure TestProc (
         TableName in varchar2)
    is
         rec TestTab1%rowtype;
         cur sys_refcursor;
         curStr varchar2(1024) := 'select * from ' || TableName;
    begin
         open cur for curStr;
         loop
              fetch cur into rec;
              exit when cur%notfound;
              dbms_output.put_line ('value = ' || rec.val);
         end loop;
    end;
    insert into TestTab1 (val) values (1);
    insert into TestTab1 (val) values (2);
    insert into TestTab1 (val) values (3);
    insert into TestTab1 (val) values (4);
    insert into TestTab2 (val) values (101);
    insert into TestTab2 (val) values (102);
    insert into TestTab2 (val) values (103);
    insert into TestTab2 (val) values (104);
    begin TestProc('TestTab1'); end;
    begin TestProc('TestTab2'); end;
    /regards,
    Frank
    Edited by: user8704911 on Jul 11, 2011 10:35 PM
    Edited by: user8704911 on Jul 11, 2011 10:36 PM

  • Help passing table name as parameter to a procedure

    Hello,
    i'm trying to write a procedure that takes a table name as input and uses a cursor to select a column,count(1) from the passed table to the cursor. The procedure i've come up with is as follows,
    CREATE OR REPLACE
    PROCEDURE excur(
        p_tbl user_tables.table_name%type )
    AS
      type rc is ref cursor;
      c rc;
      res BOOLEAN;
    BEGIN
      open c for 'SELECT columnA,COUNT(1) FROM'|| p_tbl||';';
      close c;
    END excur;When i try to execute it, an error pops up informing that a table cannot be used in this context. As in i cannot pass a table name as an argument to a procedure. Kindly guide as to how to solve this situation.

    vishm8 wrote:
    Hello,
    i'm trying to write a procedure that takes a table name as input and uses a cursor to select a column,count(1) from the passed table to the cursor. The procedure i've come up with is as follows,
    CREATE OR REPLACE
    PROCEDURE excur(
    p_tbl user_tables.table_name%type )
    AS
    type rc is ref cursor;
    c rc;
    res BOOLEAN;
    BEGIN
    open c for 'SELECT columnA,COUNT(1) FROM'|| p_tbl||';';
    close c;
    END excur;When i try to execute it, an error pops up informing that a table cannot be used in this context. As in i cannot pass a table name as an argument to a procedure. Kindly guide as to how to solve this situation.Generally speaking, Dynamic code is a bad idea for a staggering number of reasons.
    That aside, what do you want to return? You're selecting a column and applying an aggregate function (count) but you're not grouping, that doesn't usually work out too well.
    TUBBY_TUBBZ?select owner, count(*) from all_objects;
    select owner, count(*) from all_objects
    ERROR at line 1:
    ORA-00937: not a single-group group functionWhy do you perceive the need to be able to take in ANY table name, can't you design an application where table names are known at compile time and not run time?

  • Passing Table name as parameter to proc.

    Hi,
    I need to know how to pass a table name to a oracle procedure.
    In that procedure I will put that table name in a variable and then I will make operations on that table like DELETE, UPDATE and INSERT.
    Kinldy give me the solution for the above problem as soon as possible..
    Thanks & regards,
    Kiran

    You shouldn't do it, but if you do, you can use something like this:
    Anton
    create or replace type my_parm as object
      ( name varchar2(30)
      , val  anydata
    create or replace type my_parms as table of my_parm
    create table t1( c1 number, c2 varchar2(10), c3 date )
    create or replace procedure doital( p_action in varchar2, p_tab in varchar2, parms in my_parms )
    is
      p_stmt1 varchar2(32000);
      p_stmt2 varchar2(32000);
      ind pls_integer;
      curs integer;
      dummy integer;
      t_a anytype;
      t_v varchar2(32000);
      t_n number;
      t_d date;
    begin
      curs := dbms_sql.open_cursor;
      if upper( p_action ) = 'I'
      then
        ind := parms.first;
        loop
          exit when ind is null;
          p_stmt1 := p_stmt1 || ', ' || parms( ind ).name;
          p_stmt2 := p_stmt2 || ', :b' || to_char( ind );
          ind := parms.next( ind );
        end loop;
        p_stmt1 := 'insert into ' || p_tab || ' (' || substr( p_stmt1, 2 ) || ' ) values (' || substr( p_stmt2, 2 ) || ' )';
        dbms_sql.parse( curs, p_stmt1, dbms_sql.native );
        ind := parms.first;
        loop
          exit when ind is null;
          case parms( ind ).val.GetType( t_a )
            when dbms_types.typecode_varchar2
            then
              dummy := parms( ind ).val.GetVarchar2( t_v );
              dbms_sql.bind_variable( curs, ':b' || to_char( ind ), t_v );
            when dbms_types.typecode_number
            then
              dummy := parms( ind ).val.GetNumber( t_n );
              dbms_sql.bind_variable( curs, ':b' || to_char( ind ), t_n );
            when dbms_types.typecode_date
            then
              dummy := parms( ind ).val.GetDate( t_d );
              dbms_sql.bind_variable( curs, ':b' || to_char( ind ), t_d );
          end case;
          ind := parms.next( ind );
        end loop;
      end if;
      dummy := dbms_sql.execute( curs );
      dbms_sql.close_cursor( curs );
    end;
    begin
      doital( 'I', 't1', my_parms( my_parm( 'c2', anydata.ConvertVarchar2( 'testje' ) )
                                 , my_parm( 'c1', anydata.ConvertNumber( 3 ) )
                                 , my_parm( 'c3', anydata.ConvertDate( sysdate ) )
      doital( 'I', 't1', my_parms( my_parm( 'c1', anydata.ConvertNumber( 77 ) )
                                 , my_parm( 'c2', anydata.ConvertVarchar2( 'goedzo' ) )
                                 , my_parm( 'c3', anydata.ConvertDate( sysdate - 5 ) )
    end;
    /

  • Writing procedure using table name as parameter

    I want to write a procedure to sample size any table. It could be employees, departments, etc. It will not know anything about the table (what table, columns, datatypes) until it is called.
    I want to invoke it sample_size(table_name_in, table_name_out, sample_sz).
    Table_out will be created and empty. It will determine the columns to be selected from table_in.
    It is a given that all columns in table_out exist in table_in with same name/datatypes.
    Pseudocoding:
    determine increment using size of table_in and sample_sz
    build out_var list from table_out
    select out_list from table_in
    for (rows in table_in) loop by increment
    insert into table_out
    end for
    I wrote function to get cursor:
    create or replace
    FUNCTION get_cursor
    (table_nm IN VARCHAR2,
    flds IN VARCHAR2)
    RETURN sys_refcursor
    IS
    cur sys_refcursor;
    vQry VARCHAR2(4000);
    BEGIN
    vQry := 'SELECT ' || flds || ' FROM ' || table_nm;
    OPEN cur FOR vQry;
    RETURN cur;
    END get_cursor;
    What I cannot figure out is how to define rowtype in calling procedure:
    PROCEDURE
    sample_size( table_in IN VARCHAR2,
    table_out IN VARCHAR2,
    sample_sz IN NUMBER )
    IS
    c1 sys_refcursor;
    vInto VARCHAR2(4000);
    BEGIN
    -- code to get variables desired into variable vInto (I know how to do this)
    c1 := get_cursor(table_in,vInto);
    LOOP
    FETCH c1;
    EXIT WHEN c1%NOTFOUND;
    -- code to decide wether to insert row into table_out
    END LOOP;
    CLOSE c1;
    END sample_size;
    I get error on FETCH c1; line:
    Error(47,15): PLS-00103: Encountered the symbol ";" when expecting one of the following: . into bulk
    All discussions I found about subject will have something similar to:
    Rec emp%rowtype
    and then
    fetch c1 into Rec
    None of the discussions showed me how to process an unknown table.
    If tomorrow someone tells me to sample_size table CITIES, I want to use function without having to change it.
    This is my first post. I hope I gave enough information. Thanks for any answer.

    Welcome to the forum.
    If yours is not an exercise why you don't want to use just
    <tt><b>[url http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_10002.htm#SQLRF01702]select * from table_name {sample_clause}</b></tt> ;)
    Regards
    Etbin

  • How to pass Table name as parameter

    For example, you have several tables (TableA, TableB, TableC...TableN) that have the same structure.
    Ex.
    CREATE TABLE TableA(
    id VARCHAR(5),
    name VARCHAR(20)
    CREATE TABLE TableB(
    id VARCHAR(5),
    name VARCHAR(20)
    And you want to create a stored procedure in Oracle that can be used for all of the tables (TableA, TableB, ...)
    Ex. SELECT * FROM <tablename>
    WHERE ID > 1;
    How do you write the prepareCall and Callable Statement for that?
    Thanks in advance.

    You can't, not directly.
    You have two choices:
    -Write the SQL in java, then you can use string concatenation.
    -Use 'dynamic sql' in Oracle. There is a standard package that will take dynamic sql and run it.

  • How to write a function with table name as parameter

    I created a function like this:
    create or replace function "GETNAME"
    (did in NUMBER, dtable in VARCHAR2)
    return VARCHAR2
    is
    dname varchar2(200);
    begin
    select lastname || ' ' || firstname
    into dname from dtable
    where id = did;
    return dname;
    end;
    i got an error: table or view does not exist.
    Could somebody tell me how to fix it?
    Thanks,
    Jen

    or by using a reference cursor:  create or replace function dynamic_cursor (pTab varchar2)
        return sys_refcursor as
        c sys_refcursor;
      begin
        open c for 'select * from '|| pTab;
        return c;
      end;
    SQL> exec :c := dnamic_cursor('emp');
    SQL> exec :c := dynamic_cursor('emp');
    PL/SQL procedure successfully completed.
    SQL> print c;
         EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO
          7566 JONES      MANAGER         7839 02-APR-81       2975       1000         20
          7902 FORD       ANALYST         7566 03-DEC-81       3000                    20
          7839 KING       PRESIDENT            17-NOV-81       5000                    10
          7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30
          7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10
          7369 SMITH      CLERK           7902 17-DEC-80        800                    20
          7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30
          7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30
          7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30
          7788 SCOTT      ANALYST         7566 09-DEC-82       3000                    20
          7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30
          7876 ADAMS      CLERK           7788 12-JAN-83       1100                    20
          7900 JAMES      CLERK           7698 03-DEC-81        950                    30
          7934 MILLER     CLERK           7782 23-JAN-82       1300                    10
          7945 CINDY      SALESMAN        7698 16-JAN-83       1800                    30
          7950 TINA       SALESMAN        7698 18-JAN-83       1850                    30
    16 rows selected.
    SQL>

  • Is it possible to pass table name as parameter to function calls?

    Let's say I would like to retrieve data from table BSAD, BSID, BSIS, BSAS with the exact same WHERE conditions.
    I.E.
          SELECT SINGLE * FROM bsis
               WHERE bukrs = zbukrs
                 AND belnr = zbelnr
                 AND gjahr = zgjahr
                 AND buzei = bseg-buzei.
          SELECT SINGLE * FROM bsas
               WHERE bukrs = zbukrs
                 AND belnr = zbelnr
                 AND gjahr = zgjahr
                 AND buzei = bseg-buzei.
    Is there a way that I could put them into a function and do something like?
    perform select_table_bsas using 'bsas'.
    perform select_table_bsis using 'bsis'.
    and I should get SELECT * FROM passed from the function calls.
    Thanks.

    Hello,
    You can try something like this
    DATA : LV_DBTAB1 LIKE DD02L-TABNAME.
    DATA : DREF TYPE REF TO DATA.
    FIELD-SYMBOLS: <ITAB> TYPE ANY TABLE. " used to store dynamic tables
    LV_DBTAB1 = 'MARA'. " in caps
      CREATE DATA DREF TYPE STANDARD TABLE OF (LV_DBTAB1)
                                WITH NON-UNIQUE DEFAULT KEY.
      ASSIGN DREF->* TO <ITAB> .
    * chooses only english values
      SELECT * FROM (LV_DBTAB1) INTO TABLE <ITAB> WHERE SPRAS = 'E'.
    here, even the internal table is dynamic, but that can be static if you know the structure for sure

  • Pass table name as parameter PLS-00357

    create or replace
    PROCEDURE universal_p (
    tab IN VARCHAR2,
    col IN VARCHAR2,
    whr IN VARCHAR2 := NULL)
    IS
    TYPE cv_type IS REF CURSOR;
    cv cv_type;
    val VARCHAR2(32767);
    BEGIN
    OPEN cv FOR
    'SELECT ' || col ||
    ' FROM ' || tab ||
    ' WHERE ' || NVL (whr, '1 = 1');
    LOOP
    FETCH cv INTO val;
    EXIT WHEN cv%NOTFOUND;
    IF cv%ROWCOUNT = 1
    THEN
    DBMS_OUTPUT.PUT_LINE (RPAD ('-', 60, '-'));
    DBMS_OUTPUT.PUT_LINE (
    'Contents of ' ||
    UPPER (tab) || '.' || UPPER (col));
    DBMS_OUTPUT.PUT_LINE (RPAD ('-', 60, '-'));
    END IF;
    DBMS_OUTPUT.PUT_LINE (val);
    END LOOP;
    CLOSE cv;
    END;
    WHEN I CALL THIS PROCEDURE I got error messasge
    ORA-06550: Table,View Or Sequence reference not allowed in this context.
    PLS-00357:
    Can anyone can help me, please ?
    WHEN
    Edited by: user6446424 on 11.3.2010 13:59

    Works for me:
    SQL> create or replace
      2  PROCEDURE universal_p (
      3  tab IN VARCHAR2,
      4  col IN VARCHAR2,
      5  whr IN VARCHAR2 := NULL)
      6  IS
      7  TYPE cv_type IS REF CURSOR;
      8  cv cv_type;
      9  val VARCHAR2(32767);
    10  BEGIN
    11  OPEN cv FOR
    12  'SELECT ' || col ||
    13  ' FROM ' || tab ||
    14  ' WHERE ' || NVL (whr, '1 = 1');
    15
    16  LOOP
    17  FETCH cv INTO val;
    18  EXIT WHEN cv%NOTFOUND;
    19  IF cv%ROWCOUNT = 1
    20  THEN
    21  DBMS_OUTPUT.PUT_LINE (RPAD ('-', 60, '-'));
    22  DBMS_OUTPUT.PUT_LINE (
    23  'Contents of ' ||
    24  UPPER (tab) || '.' || UPPER (col));
    25  DBMS_OUTPUT.PUT_LINE (RPAD ('-', 60, '-'));
    26  END IF;
    27  DBMS_OUTPUT.PUT_LINE (val);
    28  END LOOP;
    29
    30
    31  CLOSE cv;
    32  END;
    33
    34  /
    Procedure created.
    SQL> exec universal_p('EMP','ENAME')
    Contents of EMP.ENAME
    SMITH
    ALLEN
    WARD
    JONES
    MARTIN
    BLAKE
    CLARK
    SCOTT
    KING
    TURNER
    ADAMS
    JAMES
    FORD
    MILLER
    PL/SQL procedure successfully completed.
    SQL> select * from v$version
      2  ;
    BANNER
    Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
    PL/SQL Release 11.1.0.6.0 - Production
    CORE    11.1.0.6.0      Production
    TNS for 32-bit Windows: Version 11.1.0.6.0 - Production
    NLSRTL Version 11.1.0.6.0 - ProductionMax
    http://oracleitalia.wordpress.com

  • Not able to pass table name as parameter in function

    Hi,
    i am not able to pass tablename as parameter. I am using below function.
    function count_test(tabname varchar2) return number is
    l_count number;
    begin
    select count(*) INTO l_count FROM tabname;
    RETURN l_count;
    END;

    You can't do it with static SQL.
    The only way is to do it with dynamic SQL:
    EXECUTE IMMEDIATE 'select count(*) FROM '|| tabname INTO l_count;
    Regards.
    Al
    Edited by: Alberto Faenza on May 10, 2012 1:44 AM
    Mispelling

  • How to set dynamic table name in sql query?

    I want set dynamic table name by parameter in sql query,just like:
    select * from :tbname
    but run report is error,BI P report table name is invalidation.
    What can i do? Thanks!

    Hi,
    that's only possible inside a data template with a lexical parameter.
    Regards
    Rainer

  • Use table name in UPDATE statement as variable

    Hi All,
    I am using ORACLE 9i AIX base. I want to write following procedure:
    PROCEDURE update_header (
    p_care_msg_nbr IN NUMBER,
    p_care_msg_id IN NUMBER,
    p_care_msg_gkey IN NUMBER,
    p_old_status IN VARCHAR2,
    p_new_status IN VARCHAR2
    IS
    l_table varchar2(50);
    BEGIN
    l_table := 'CARE_EDI_MESSAGES';
    UPDATE '&l_table'
    SET status = p_new_status,
    changed = sysdate,
    changer = user
    WHERE care_msg_no = p_care_msg_nbr
    AND care_msg_id = p_care_msg_id
    AND gkey = p_care_msg_gkey
    AND status = p_old_status;
    END;
    I want to give the table name by passing value in a variable or parameter. Is it the write way or can I do this function in any other way.
    Pleae tell me in urgency.
    Thanks & Regards
    Hassan Raza

    This implies that you have several tables with identical or near identical structures, otherwise you will get errors if any of the mentioned columns do not exist in the table passed but ...
    You cannot use a substitution variable that way. Oracle will ask for a value when you try to create the procedure, and compile what ever value you supply into the procedure viz.
    SQL> CREATE PROCEDURE p AS
      2  l_id NUMBER;
      3  BEGIN
      4     SELECT id INTO l_id FROM &t;
      5  END;
      6  /
    Enter value for t: T
    old   4:    SELECT id INTO l_id FROM &t;
    new   4:    SELECT id INTO l_id FROM T;
    Procedure created.
    SQL> SELECT text FROM user_source WHERE name = 'P'
      2  ORDER BY line;
    TEXT
    PROCEDURE p AS
    l_id NUMBER;
    BEGIN
       SELECT id INTO l_id FROM T;
    END;Even if that is the effect you want, note that there are no quotes around the substitution variable in the CREATE statement.
    If you want to be able to pass the name of the table to the procedure, then you need to make the table name a parameter, then build the sql statement and execute it using EXECUTE IMMEDIATE. Something more like:
    PROCEDURE update_header (p_care_msg_nbr  IN NUMBER,
                             p_care_msg_id   IN NUMBER,
                             p_care_msg_gkey IN NUMBER,
                             p_old_status    IN VARCHAR2,
                             p_new_status    IN VARCHAR2,
                             p_table         IN VARCHAR2) IS
    l_sqlstr VARCHAR2(4000);
    BEGIN
       l_sqlstr := 'UPDATE '||p_table||' SET status = :b1 '||
                   'changed = sysdate, changer = user '||
                   'WHERE care_msg_no = :b1 and care_msg_id = :b3 and '||
                   'gkey = :b4 and status = :b5';
       EXECUTE IMMEDIATE l_sqlstr
          USING p_new_status, p_care_msg_nbr, p_care_msg_id, p_care_msg_gkey, p_old_status;
    END;HTH
    John

Maybe you are looking for

  • New MBP 15 retina (mid 2014) freeze during initial setup - any issues?

    Hi all - just picked up a new retina MBP 15 base model (integrated graphics / 256GB / 16 GB RAM).  After turning it on for the first time and running the initial setup the computer froze on the diagnostics and usage page (after I clicked continue). 

  • How can i add portlet programetically to a page

    Hi I want to create a portlet that contains a list of my portlets so i can place this on a page(by default customization) and all the authorized users can just click on items of this portlet to add this item to their view of the page. This is just to

  • IPod Battery Replacement Program

    Hi Everyone, My green iPod mini is now in need of a new battery. I read over the Battery Replacement FAQ, but I'm not sure how the condition of the iPod mini I recieve will be. So I guess I have a few questions. Has anyone participated in this progra

  • Index problem in my font program--very very important

    Hi friends, in the below program which i have given go to the if loop of "Times New Roman Font" and there i have given two setText inputs.But when i give two or more input within one if loop ,i am getting only the last input as many times in my combo

  • Bdoc error "B partner with GUID B................ does not exist"

    Hi Guru, basically here I experienced this Bdoc error due to the fact that R/3 people took the decision to delete Master client data from R/3 tables, and afterward to reload Master clients data via legacy. Some manual entries were already created in