代码之家  ›  专栏  ›  技术社区  ›  Gaurav Thantry

使用CLOB输出调用存储过程

  •  -1
  • Gaurav Thantry  · 技术社区  · 6 年前

    我在试着用 CLOB 数据类型作为存储过程中的输出参数,因为其结果集超过 var 如何执行该过程?下面是我执行的命令。

    我尝试将结果集分配给 克洛布 变量使用 INTO 如查询中所示的查询。

    var cl CLOB; EXECUTE procedure_name(:cl); print cl;

    我如何声明绑定变量,因为如果您查看第一个命令,我首先初始化 cl

    这是我的程序示例。过程中的实际查询有700行长。

    CREATE OR REPLACE PROCEDURE procedure_name (cl OUT CLOB)
    IS
    BEGIN OPEN cl FOR
    SELECT * FROM .....
    statement 1
    .
    .
    .
    .
    .
    statement n
    INTO cl
    FROM
    statement 1
    .
    .
    .
    statement n
    EXCEPTION 
     WHEN 
      OTHERS THEN 
       DECLARE 
          err_num NUMBER  := SQLCODE; 
          err_msg VARCHAR2(512) := SQLERRM; 
          error_id_pk NUMBER; 
          error_dt DATE; 
       BEGIN
          SELECT (REGEXP_REPLACE(CURRENT_TIMESTAMP, '[^0-9]+', ''))INTO error_id_pk FROM DUAL;
          SELECT SYSDATE INTO error_dt FROM DUAL;
          INSERT INTO ODS_CONTROL.ERROR_DETAILS(ERROR_ID, ERROR_CODE, ERROR_DATE, PROCEDURE_NAME, ERROR_MSG)
          VALUES ( error_id_pk,
                   err_num,
                   error_dt,
                   'PRC_FLEXI_CARD',
                    err_msg 
                  ); 
         END; 
    END;

    Error starting at line : 2 in command -
    EXECUTE procedure_name( :clb )
    Error report -
    ORA-06550: line 1, column 7:
    PLS-00905: object procedure_name is invalid
    ORA-06550: line 1, column 7:
    PL/SQL: Statement ignored
    06550. 00000 -  "line %s, column %s:\n%s"
    *Cause:    Usually a PL/SQL compilation error.
    *Action:
    1 回复  |  直到 6 年前
        1
  •  1
  •   Community CDub    5 年前

    [TL;[医生] VAR 是用于声明变量的关键字,不是数据类型;您的实际错误是由于在尝试定义过程时使用了无效语法,而该过程尚未编译。


    变量 是的缩写 VARIABLE 并定义一个PL/SQL绑定变量。

    本声明具有 syntax :

    VAR[IABLE] [variable [type] ]
    

    其中type表示以下内容之一:

    NUMBER
    CHAR
    CHAR (n [CHAR | BYTE])
    NCHAR
    NCHAR (n)
    VARCHAR2 (n [CHAR | BYTE])
    NVARCHAR2 (n)
    BLOB
    BFILE
    CLOB
    NCLOB
    REFCURSOR
    BINARY_FLOAT
    BINARY_DOUBLE
    

    var cl CLOB;
    

    变量 关键字,变量名为 cl 而且是那种 CLOB

    还有,你的 CREATE PROCEDURE 语句有语法错误,因为过程名称周围不能有单引号。例如:

    CREATE PROCEDURE procedure_name (clb OUT CLOB)
    IS
    BEGIN
      clb := 'test';
    END;
    /
    

    然后:

    VAR cl CLOB;
    EXECUTE procedure_name( :cl );
    PRINT cl;
    

    test
    

    更新 :

    SQL Fiddle

    :

    CREATE TABLE ERROR_DETAILS(
      ERROR_ID       NUMBER,
      ERROR_CODE     NUMBER,
      ERROR_DATE     DATE,
      PROCEDURE_NAME VARCHAR2(30),
      ERROR_MSG      VARCHAR2(512)
    )
    /
    
    CREATE PROCEDURE procedure_name (cl OUT CLOB)
    IS
    BEGIN
      SELECT DUMMY
      INTO   cl
      FROM   dual
      WHERE  ROWNUM = 1;
    EXCEPTION 
     WHEN 
      OTHERS THEN 
       DECLARE 
         err_num NUMBER  := SQLCODE; 
         err_msg VARCHAR2(512) := SQLERRM; 
       BEGIN
         INSERT INTO /* ODS_CONTROL. */ ERROR_DETAILS(
           ERROR_ID,
           ERROR_CODE,
           ERROR_DATE,
           PROCEDURE_NAME,
           ERROR_MSG
         ) VALUES (
           TO_NUMBER( TO_CHAR( CURRENT_TIMESTAMP, 'YYYYMMDDHH24MISSFF9' ) ),
           err_num,
           SYSDATE,
           'PRC_FLEXI_CARD',
           err_msg 
         ); 
       END; 
    END;
    /
    

    查询1 :

    SELECT * FROM USER_ERRORS
    

    Results :

    No rows selected