ORA-00932: 不一致的数据类型: 预期 - 得到 - ORA-06512:

Posted

技术标签:

【中文标题】ORA-00932: 不一致的数据类型: 预期 - 得到 - ORA-06512:【英文标题】:ORA-00932: inconsistent datatypes: expected - got - ORA-06512: 【发布时间】:2020-01-26 05:01:28 【问题描述】:

我写了一个简单的plsql块,编译时执行成功。

 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;
 / 

【问题讨论】:

只是一个旁注。虽然我看不到动态 SQL 的必要性,但我确实看到了不必要的双引号(使用两个单引号)以便在最终结果中生成一个。从版本 10 开始,Oracle 提供了一种替代机制 q'[...]'。基本上在您的查询中,双引号减少为单引号,四引号('''')减少为('')。请参阅文章quoting string literals。这是一篇较旧的文章,但内容仍然有效。 【参考方案1】:

问题selecet 查询中有多个columns,但into 子句只有一个变量来保存它们。

解决方案select clausecolumns 的编号和数据类型* 必须与into clause 中变量的编号和数据类型匹配。

我正在考虑您的查询将返回单个记录,因为如果 select 查询返回多于 1 条记录,则 noraml INTO 将引发错误。

如果您有返回多条记录的查询,那么您必须使用bulk collect 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;
 / 

现在,您可以在 execute immediate 之后的任何其他逻辑中使用 vcolidvcoldesc

干杯!!

【讨论】:

ORA-01422:精确提取返回的行数超过了请求的行数 ORA-06512:在第 5 行 顺便问一下,你为什么使用动态查询?

以上是关于ORA-00932: 不一致的数据类型: 预期 - 得到 - ORA-06512:的主要内容,如果未能解决你的问题,请参考以下文章

ORA-00932: 不一致的数据类型: 预期 - 得到 CLOB

如何修复 PL/SQL:ORA-00932:不一致的数据类型:预期的 CLOB 得到了 -

ora-00932 不一致的数据类型预期数字得到 char plsql

ORA-00932: 不一致的数据类型: 预期 - 得到 clob 休眠/弹簧启动

无法选择 *(ORA-00932:不一致的数据类型:预期的 CHAR 得到了 ADT)

查找错误 ORA-00932:不一致的数据类型:预期的 DATE 得到了 NUMBER