Вызов хранимой процедуры с выводом CLOB - PullRequest
0 голосов
/ 01 октября 2018

Я пытаюсь использовать тип данных 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 голосов
/ 01 октября 2018

[TL; DR] VAR - ключевое слово для объявления переменной и не является типом данных;Ваша фактическая ошибка связана с использованием неверного синтаксиса, когда вы пытались определить свою процедуру, но она не скомпилирована.


VAR - это сокращение от VARIABLE и определяет переменную связывания PL / SQL.

Это объявление имеет синтаксис :

VAR[IABLE] [variable [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

Результаты :

No rows selected
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...