ORA-00932: противоречивые типы данных: ожидается - получил - ORA-06512: - PullRequest
0 голосов
/ 26 января 2020

Я написал простой блок pl sql, и он был успешно выполнен при компиляции.

 declare

 begin
  EXECUTE IMMEDIATE 'SELECT  COLUMN_ID,
        COLUMN_NAME || '' '' || DATA_TYPE || DECODE(DATA_TYPE,''ROWID'','''',''DATE'','''',NULLIF(''('' || DECODE(DATA_TYPE,''NUMBER'',DATA_PRECISION||'',''||DATA_SCALE,DATA_LENGTH) || '')'',''(,)''))  AS COLS
          FROM ALL_TAB_COLS a WHERE OWNER=USER AND TABLE_NAME=''AQ_EVENT_TABLE''';
 end;
 /

Но, когда я пытаюсь добавить неявный курсор, я получаю эту ошибку:

[Error] Execution (1: 2): ORA-00932: inconsistent datatypes: expected - got -
ORA-06512: at line 4

Мой код:

 declare
 vSQLSlctString varchar2(255);
 begin
  EXECUTE IMMEDIATE 'SELECT  COLUMN_ID,
        COLUMN_NAME || '' '' || DATA_TYPE || DECODE(DATA_TYPE,''ROWID'','''',''DATE'','''',NULLIF(''('' || DECODE(DATA_TYPE,''NUMBER'',DATA_PRECISION||'',''||DATA_SCALE,DATA_LENGTH) || '')'',''(,)''))  AS COLS
          FROM ALL_TAB_COLS a WHERE OWNER=USER AND TABLE_NAME=''AQ_EVENT_TABLE''' INTO vSQLSlctString;
 end;
 / 

1 Ответ

1 голос
/ 26 января 2020

Проблема : в запросе selecet есть несколько columns, но в предложении into есть только одна переменная для их хранения.

Разрешение : число и тип данных columns в select clause должен совпадать с номером и типом данных переменных в into clause.

Я считаю, что ваш запрос вернет одну запись, так как noraml INTO будет выдает ошибку, если запрос select возвращает более 1 записи.

Если у вас есть запрос, который возвращает несколько записей, вам необходимо использовать массовый сбор into и некоторые udt.

Пожалуйста, используйте следующий блок.

declare
 vcolid number;
 vcoldesc varchar2(4000);
 begin
  EXECUTE IMMEDIATE 'SELECT  COLUMN_ID,
        COLUMN_NAME || '' '' || DATA_TYPE || DECODE(DATA_TYPE,''ROWID'','''',''DATE'','''',NULLIF(''('' || DECODE(DATA_TYPE,''NUMBER'',DATA_PRECISION||'',''||DATA_SCALE,DATA_LENGTH) || '')'',''(,)''))  AS COLS
          FROM ALL_TAB_COLS a WHERE OWNER=USER AND TABLE_NAME=''AQ_EVENT_TABLE''' INTO vcolid, vcoldesc;
 end;
 / 

Теперь вы можете использовать vcolid и vcoldesc в любых других логах c после этого execute immediate.

Ура !!

...