Dynamic SQL in PL/SQL, DBMS problem

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • cuqsy0
    New Member
    • Apr 2012
    • 22

    #1

    Dynamic SQL in PL/SQL, DBMS problem

    Hi Experts,

    I need to develop a dynamic SQL in PL SQL to query an unknown number of columns. Let me take a sample query here:
    SELECT FIRST_NAME, LAST_NAME FROM VENDOR_CONTACTS
    With "known number of column" method (in this case we have known that we are querying two columns: "FIRST_NAME " and "LAST_NAME" ), I write a code based on the template in table 8-2 of http://docs.oracle.com/cd/B10500_01/...9dyn.htm#26586. The query works fine.
    --------------------------------------------------------------------------
    DECLARE
    stmt_str varchar2(200);
    cur_hdl int;
    rows_processed int;
    FIRST_NAME varchar2(200);
    LAST_NAME varchar2(200);
    BEGIN
    cur_hdl := dbms_sql.open_c ursor; -- open cursor
    stmt_str := 'SELECT FIRST_NAME, LAST_NAME FROM VENDOR_CONTACTS ';

    dbms_sql.parse( cur_hdl, stmt_str, dbms_sql.native );

    -- describe defines
    dbms_sql.define _column(cur_hdl , 1, FIRST_NAME, 200);
    dbms_sql.define _column(cur_hdl , 2, LAST_NAME, 200);

    rows_processed := dbms_sql.execut e(cur_hdl);
    --execute

    LOOP
    -- fetch a row
    IF dbms_sql.fetch_ rows(cur_hdl) > 0 then

    -- fetch columns from the row
    dbms_sql.column _value(cur_hdl, 1, FIRST_NAME);
    dbms_sql.column _value(cur_hdl, 2, LAST_NAME);

    dbms_output.put _line('First Name' ||' = '||FIRST_NAME || '; Last Name' ||' = '||LAST_NAME);


    -- <process data>

    ELSE
    EXIT;
    END IF;
    END LOOP;

    dbms_sql.close_ cursor(cur_hdl) ; -- close cursor
    END;
    /
    --------------------------------------------------------------------------

    However, for "unknown number of columns" method, following http://stackoverflow.com/questions/1...l-from-sqlplus, my code for the same query has error.

    --------------------------------------------------------------------------
    DECLARE
    stmt_str varchar2(200);
    cur_hdl int;
    rows_processed int;

    l_columns dbms_sql.desc_t ab;
    l_dummy NUMBER;
    l_value NUMBER;
    BEGIN
    cur_hdl := dbms_sql.open_c ursor; -- open cursor
    stmt_str := 'SELECT FIRST_NAME, LAST_NAME FROM VENDOR_CONTACTS ';

    dbms_sql.parse( cur_hdl, stmt_str, dbms_sql.native );

    -- describe defines
    --dbms_sql.define _column(cur_hdl , 1, FIRST_NAME, 200);
    --dbms_sql.define _column(cur_hdl , 2, LAST_NAME, 200);
    --
    dbms_sql.descri be_columns(cur_ hdl, l_dummy, l_columns);
    FOR i IN 1..l_columns.co unt LOOP
    dbms_sql.define _column(cur_hdl , i, l_columns(i).co l_name, l_columns(i).co l_type);
    END LOOP;
    --

    --rows_processed := dbms_sql.execut e(cur_hdl);
    l_dummy := dbms_sql.execut e_and_fetch(cur _hdl, TRUE);
    --execute

    LOOP
    -- fetch a row
    IF dbms_sql.fetch_ rows(cur_hdl) > 0 then

    -- fetch columns from the row
    -- dbms_sql.column _value(cur_hdl, 1, FIRST_NAME);
    -- dbms_sql.column _value(cur_hdl, 2, LAST_NAME);

    FOR i IN 1..l_columns.co unt LOOP
    dbms_sql.column _value(cur_hdl, i, l_value);

    -- dbms_output.put _line('First Name' ||' = '||FIRST_NAME || '; Last Name' ||' = '||LAST_NAME);
    dbms_output.put _line(l_columns (i).col_name ||' = '||l_value);
    END LOOP;

    -- <process data>

    ELSE
    EXIT;
    END IF;
    END LOOP;

    dbms_sql.close_ cursor(cur_hdl) ; -- close cursor
    END;
    /
    --------------------------------------------------------------------------
    Thank for help in advance.

    -Cuq
  • cuqsy0
    New Member
    • Apr 2012
    • 22

    #2
    It is a very simple job to do this in Microsoft T-SQL, but it seems to be a very hard or impossible work in Oracle PL/SQL.

    Comment

    Working...