【问题标题】:DBMS_SQL.COLUMN_VALUE throwing - > PL/SQL: numeric or value error: character string buffer too small errorDBMS_SQL.COLUMN_VALUE throwing -> PL/SQL: numeric or value error: 字符串缓冲区太小错误
【发布时间】:2022-08-02 17:10:08
【问题描述】:

我正在尝试在匿名块中动态执行 SQL,并使用外部程序的 \':::\' 分隔符获取记录。 当获取超过 13-15 条记录时,它会失败。

declare
    mysql varchar2(3000) := \'select sid,username,status,event,p1,p2,p3 from v$session where rownum<30\';
    col DBMS_SQL.DESC_TAB;
    data varchar2(4000);
    state boolean;
        function sqlformat ( col in DBMS_SQL.DESC_TAB, col_cnt number, indx number) return varchar2 AS
            begin
             if indx = col_cnt then
                        data := col(indx).col_name;
            else
                        data := col(indx).col_name||\':::\';
            end if;
             return data;
            end sqlformat;
        function sqlexecute  ( mysql IN varchar2) return boolean AS
            handle number;
            col_cnt number;
            col DBMS_SQL.DESC_TAB;
            v_exec number;
            output varchar2(4000);
        begin
           handle := DBMS_SQL.OPEN_CURSOR;
           DBMS_SQL.PARSE(handle, mysql, DBMS_SQL.NATIVE);
           v_exec := DBMS_SQL.EXECUTE(handle);
           DBMS_SQL.DESCRIBE_COLUMNS(handle, col_cnt, col);
           FOR indx in 1..col_cnt
            loop
               data := sqlformat(col,col_cnt,indx);
               DBMS_SQL.define_column(handle, indx, col(indx).col_name,4000);
               output := output||data;
            end loop;
           dbms_output.put_line(output);
           dbms_output.NEW_LINE();
            while DBMS_SQL.fetch_rows(handle) > 0
           loop
               state:=True;
               output := NULL;
                data :=NULL;
                FOR indx in 1..col_cnt
               loop
                DBMS_SQL.COLUMN_VALUE(handle, indx, col(indx).col_name);
                data := sqlformat(col,col_cnt,indx);
                output := output||data;
                dbms_output.NEW_LINE();
            end loop;
           dbms_output.put_line(output);
            end loop;
           return state;
           end;
    begin
    state :=sqlexecute(mysql);
    end;
/

`SID:::USERNAME:::STATUS:::EVENT:::P1:::P2:::P3`
`1::::::ACTIVE:::rdbms ipc message:::100:::0:::0`
`3::::::ACTIVE:::rdbms ipc message:::300:::0:::0`
`4::::::ACTIVE:::rdbms ipc message:::300:::0:::0`
`5::::::ACTIVE:::DIAG idle wait:::3:::1:::0`
`6::::::ACTIVE:::watchdog main loop:::0:::20:::0`
`7::::::ACTIVE:::rdbms ipc message:::180000:::0:::0`
`8::::::ACTIVE:::rdbms ipc message:::100:::0:::0`
`9::::::ACTIVE:::rdbms ipc message:::300:::0:::0`
`10::::::ACTIVE:::ASM background timer:::0:::0:::0`
`11::::::ACTIVE:::Space Manager: slave idle wait:::1:::0:::0`
`13::::::ACTIVE:::class slave wait:::0:::0:::0`
`15::::::ACTIVE:::rdbms ipc message:::30000:::0:::0`
`17::::::ACTIVE:::Space Manager: slave idle wait:::2:::0:::0`

宣布 * 第 1 行的错误: ORA-06502: PL/SQL: 数字或值错误: 字符串缓冲区太小 ORA-06512:在 \"SYS.DBMS_SQL\",第 1795 行 ORA-06512:在第 41 行 ORA-06512: 在第 51 行

    标签: plsql plsql-package


    【解决方案1】:

    我建议尝试在每个字符串对象中插入 substr 以了解哪个变量得到错误:

    data   := substr(col(indx).col_name,1,4000);
    data   := substr(col(indx).col_name||':::',1,4000);
    output := substr(output||data,1,4000);
    output := substr(output||data,1,4000);
    

    谢谢

    【讨论】:

      猜你喜欢
      • 2011-01-05
      • 1970-01-01
      • 2013-07-14
      • 2011-09-06
      • 2013-09-14
      • 2011-03-31
      • 1970-01-01
      • 2011-11-25
      相关资源
      最近更新 更多