加入收藏 | 设为首页 | 会员中心 | 我要投稿 源码网 (https://www.900php.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

空Oracle DEF CURSOR中的列名

发布时间:2021-01-16 22:12:19 所属栏目:百科 来源:网络整理
导读:在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

(编辑:源码网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读