空Oracle DEF CURSOR中的列名
发布时间:2021-01-17 02:07:46  所属栏目:百科  来源:网络整理 
            导读:在PL / SQL中,我可以使用这样的技巧来查找REF CURSOR中每行的每个列的名称/值对: TO_CHAR of an Oracle PL/SQL TABLE type 这是一个很棒的技巧.但是当REF CURSOR为空时它不起作用,例如这里的那个(这只是一个例子.真正的光标不从DUAL中选择): OPEN cursor
                
                
                
            | 在PL / SQL中,我可以使用这样的技巧来查找REF CURSOR中每行的每个列的名称/值对: TO_CHAR of an Oracle PL/SQL TABLE type 这是一个很棒的技巧.但是当REF CURSOR为空时它不起作用,例如这里的那个(这只是一个例子.真正的光标不从DUAL中选择): OPEN cursor FOR SELECT 1 FROM DUAL WHERE 1 = 0; 空REF CURSOR是否有列名/类型信息? 解决方法是的,我尝试过没有行的解决方案,你说得对.从我有限的角度来看,我认为我们需要两种不同的方法来检索列的名称和值. 1)Dbms_sql包检索列的名称. 2)检索数据的tbone方法. 程序 create or replace procedure demo(sqlText in varchar2) is
    refCur sys_refcursor;
    curId  integer;
    cnt    number;
    ret    dbms_sql.desc_tab;
    recTab dbms_sql.desc_tab;
    FORMAT_STRING constant pls_integer := 20;
    procedure printDescTab(desctab in sys.dbms_sql.desc_tab) is
    begin
        -- do what you want with the columns
        for i in 1 .. desctab.count
        loop
            dbms_output.put(lpad(desctab(i).col_name,FORMAT_STRING));
        end loop;
        dbms_output.new_line;
    end printDescTab;
    procedure PrintCur(cv in sys_refcursor) is
    begin
        for c in ( --select t2.COLUMN_VALUE.getrootelement() name,select EXTRACTVALUE(t2.COLUMN_VALUE,'node()') value
                  from   table(XMLSEQUENCE(cv)) t,table(XMLSEQUENCE(EXTRACT(COLUMN_VALUE,'/ROW/node()'))) t2)
        loop
            DBMS_OUTPUT.put(lpad(c.VALUE,FORMAT_STRING));
        end loop;
        dbms_output.new_line;
        dbms_output.new_line;
    end;
begin
    dbms_output.put_line('dynamic sql: ' || sqlText);
    curId := dbms_sql.open_cursor();
    --  checks for sql injection to do...
    dbms_sql.parse(curId,sqlText,dbms_sql.native);
    dbms_sql.describe_columns(curId,cnt,recTab);
    printDescTab(recTab);
    dbms_sql.close_cursor(curId);
    open refCur for sqlText;
    PrintCur(refCur);
    close refCur;
exception
    when others then
        if dbms_sql.is_open(curId) then
           dbms_sql.close_cursor(curId);
        end if;
        if refCur%isopen then
            close RefCur;
        end if;
        dbms_output.put_line(sqlcode || ' - ' || sqlerrm);
end demo;测试 declare
    sqlText varchar2(2000);
begin
    sqlText := 'select 1 as one,2 as two  from  dual where 1=0';
    demo(sqlText);
    sqlText   := 'select name,type || chr(13) type' -- chr(13) specific ASCII Carriage return
                ||' from   user_plsql_object_settings'
                ||' where name not like ''%$%'' and  rownum <= 10';      
    demo(sqlText);   
    sqlText := 'select 1 as one,2 as two  from  dual ';                  
    demo(sqlText);
exception
    when others then
        dbms_output.put_line(sqlcode || ' - ' || sqlerrm);
end;结果 dynamic sql: select 1 as one,2 as two  from  dual where 1=0
                 ONE                 TWO
dynamic sql: select name,type || chr(13) type from   user_plsql_object_settings where name not like '%$%' and  rownum <= 10
                NAME                TYPE
     ADD_JOB_HISTORY          PROCEDURE
    AFT_INS_TEST_TRG            TRIGGER
    BEF_DEL_TEST_TRG            TRIGGER
    BEF_INS_TEST_TRG            TRIGGER
            BETWNSTR           FUNCTION
                BOOL           FUNCTION
    CACHED_FIBONACCI           FUNCTION
               DEBUG            PACKAGE
               DEBUG       PACKAGE BODY
          DEBUG_TEST          PROCEDURE
dynamic sql: select 1 as one,2 as two  from  dual 
                 ONE                 TWO
                   1                   2(编辑:宣城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! | 
站长推荐
            
        


