Oracle 00932. 00000 - “不一致的数据类型:预期的 %s 得到了 %s”

Posted

技术标签:

【中文标题】Oracle 00932. 00000 - “不一致的数据类型:预期的 %s 得到了 %s”【英文标题】:Oracle 00932. 00000 - "inconsistent datatypes: expected %s got %s" 【发布时间】:2015-05-10 16:15:25 【问题描述】:

好吧,我还是 oracle 的新手,我正在尝试使用子查询查询一个表。它看起来像这样

select id_user, count(*) as jumlah from (select * from users where username = 'usr' and pass = 'pwd' and company_id = 'PAN' and status = 1) 
group by id_user;

上面的代码有效。但是当我尝试将它放在存储过程中时,我遇到了一些这样的错误

这是存储过程

create type login_obj is object(jumlah integer);
create type login_table is table of login_obj;
create or replace function startLogin(u varchar, p varchar, cid varchar)
return login_table
is
  tabel login_table := login_table();
  the_count integer;
  the_sql varchar(200);
begin
  the_sql := 'select id_user, count(*) as jumlah from (select * from users where username = ''' || u || ''' and pass = ''' || p || ''' and company_id = ''' || cid || ''' and status = 1) GROUP BY id_user';
  execute immediate the_sql into the_count;

  if the_count IS NOT NULL
  then
  begin
    tabel.extend;
    tabel(1) := login_obj(the_count);
  end;
  end if;
  return tabel;
end;

然后由

执行
select * from table (startLogin('usr','pwd','PAN'));

这里是错误

SQL Error: ORA-00932: inconsistent datatypes: expected - got -
ORA-06512: at "LUKI.STARTLOGIN", line 14
00932. 00000 -  "inconsistent datatypes: expected %s got %s"

有什么想法吗?

【问题讨论】:

您选择了两列并试图将结果填充到一个变量中。 @Mat 。 . .比这更糟,因为查询可能返回不止一行。 哼。而子选择和动态SQL显然也没用。 【参考方案1】:

在该行下方再添加一个变量

the_sql varchar(200);

作为

yid_user users.id_user%TYPE;

并将您的执行立即更改为

execute immediate the_sql into yid_user, the_count;

还有一些在 Oracle 中使用变量类型的技巧:

1. VARCHAR is obsolete, use VARCHAR2 instead.
2. Instead of using INTEGER type, use NUMBER.

【讨论】:

非常感谢老兄!真的行。我把工作代码放在下面 @thekucays,您应该使用变量绑定而不是将变量嵌入到 sql 语句中。检查 USING 关键字。【参考方案2】:

您的查询返回 2 列,但 INTO 中只定义了一列。

【讨论】:

删除id_user,无论如何您的查询应该只返回一行。 好吧,我需要“id_user”列,所以我想我不会删除它.. 还有其他想法吗? :) 如果我在“INTO”中加入另一个变量会怎样?我怎么能做到这一点? 你找到了解决方案,我假设你已经知道了,因为这是非常基本的 SQL 知识:-) 是的,那是我的错.. 无论如何感谢您的帮助 :-)【参考方案3】:

我已经想通了.. 感谢 user4884704(我已经标记了他的答案)

所以这是工作代码..将结果放在不同的变量中

create type login_obj is object(id_user integer, jumlah integer);
create type login_table is table of login_obj;
create or replace function startLogin(u varchar, p varchar, cid varchar)
return login_table
is
  tabel login_table := login_table();
  id_user integer;
  the_count integer;
  the_sql varchar(200);
begin
  the_sql := 'select id_user, count(*) as jumlah from (select * from users where username = ''' || u || ''' and pass = ''' || p || ''' and company_id = ''' || cid || ''' and status = 1) GROUP BY id_user';
  execute immediate the_sql into id_user, the_count;

  if the_count IS NOT NULL
  then
  begin
    tabel.extend;
    tabel(1) := login_obj(id_user, the_count);
  end;
  end if;
  return tabel;
end;

然后我将其执行为

select * from table (startLogin('usr','pwd','PAN')); 

【讨论】:

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

Oracle:在 UNION 语句 ORA-00932 中,clob 列与自身不一致

Oracle Open Cursor for Using 给出错误 ORA-00932:不一致的数据类型

Oracle:使用 to_lob 从 user_ind_expressions 转换 column_expression 时出现 ORA-00932

EXP-00056: 遇到 ORACLE 错误 932 ORA-00932: 数据类型不一致: 应为 BLOB, 但却获得 CHAR 导出失败

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

Entity Framework 6 - ORA-00932 同时加入 ToString