调用带有CLOB输出的存储过程

时间:2018-10-01 09:05:44

标签: plsql oracle11g

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

我尝试使用CLOB查询将结果集分配给INTO变量,如查询中所示。

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

我如何声明绑定变量,因为如果您看第一个命令,我首先将cl初始化为var,因为发出错误,所以无法将其初始化为CLOB。

这是我的过程的一个示例。该过程中的实际查询长度为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 个答案:

答案 0 :(得分:1)

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


VARVARIABLE的缩写,定义了一个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;

您正在使用VAR关键字声明一个变量,该变量名为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

Oracle 11g R2架构设置

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