加入收藏 | 设为首页 | 会员中心 | 我要投稿 上饶站长网 (https://www.0793zz.com.cn/)- 数据库平台、视觉智能、智能搜索、决策智能、迁移!
当前位置: 首页 > 站长百科 > 正文

oracle – 从过程结果中获取列名

发布时间:2021-01-19 22:54:08 所属栏目:站长百科 来源:网络整理
导读:我没有db的经验,但我试图从存储过程的结果中获取列名. 代码必须是通用的,因为存储过程是未知的. 第一步是使它适用于没有输入参数的程序(只有io_cursor) 我的代码到现在为止: procedure fakeProc ( io_cursor in out t_ref_cursor ) 我正在使用的代码: PROC

我没有db的经验,但我试图从存储过程的结果中获取列名.
代码必须是通用的,因为存储过程是未知的.
第一步是使它适用于没有输入参数的程序(只有io_cursor)

我的代码到现在为止:

procedure fakeProc (
       io_cursor        in out t_ref_cursor
      )

我正在使用的代码:

PROCEDURE get_SQL_Fields (
       out_result    out varchar2)
as

/**/

v_cur         NUMBER        := NULL;
v_count       NUMBER        := NULL;

v_tab_desc    DBMS_SQL.DESC_TAB;
sqlstr        VARCHAR2(100);
BEGIN

v_cur := DBMS_SQL.OPEN_CURSOR;
    --Here i get errors
    sqlstr :='begin '|| fakeproc()||';end;';

    DBMS_SQL.PARSE(v_cur,sqlstr,DBMS_SQL.NATIVE);
    DBMS_SQL.DESCRIBE_COLUMNS(v_cur,v_count,v_tab_desc);

    FOR i IN 1..v_count LOOP
      out_result := out_result||v_tab_desc(i).COL_NAME||',';
    END LOOP;

  end if;
END get_SQL_Fields;

所以我现在的问题是建立这个sqlstr;
我得到的错误是:错误:PLS-00306:调用’FAKEPROC’时参数的数量或类型错误
行:654
文字:sqlstr:=’begin’|| fakeproc()|| ‘;端;’;

错误:PL / SQL:语句被忽略
行:654
文字:sqlstr:=’begin’|| fakeproc()|| ‘;端;’;

解决方法

你很接近,你只是缺少 DBMS_SQL.TO_CURSOR_NUMBER将光标转换为游标数,以及动态PL / SQL绑定变量.

create or replace procedure fakeProc (io_cursor in out sys_refcursor) is
begin
    open io_cursor for 'select 1 column1,''asdf'' column2 from dual';
end;
/

create or replace PROCEDURE get_SQL_Fields (
       out_result    out varchar2)
as
    v_cur         NUMBER        := NULL;
    v_count       NUMBER        := NULL;
    v_tab_desc    DBMS_SQL.DESC_TAB;
    v_cursor      SYS_REFCURSOR;
BEGIN
    execute immediate 'begin fakeProc(:v_cursor); end;' using in out v_cursor;
    v_cur := dbms_sql.to_cursor_number(v_cursor);
    DBMS_SQL.DESCRIBE_COLUMNS(v_cur,v_tab_desc);
    FOR i IN 1..v_count LOOP
        out_result := out_result||case when i = 1 then null else ',' end
            ||v_tab_desc(i).COL_NAME;
    END LOOP;
END get_SQL_Fields;
/

declare
    v_output varchar2(32767);
begin
    get_sql_fields(v_output);
    dbms_output.put_line(v_output);
end;
/

COLUMN1,COLUMN2

这假设该过程只有一个参数.答案是否需要适用于任何可能的参数组合?

(编辑:上饶站长网)

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

    热点阅读