well i'm still new in oracle, i'm trying to query a table with a subquery..it looks like this
好吧,我仍然是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;
the above code works. but when i try to put it inside a stored procedure i got some errors like this
上面的代码有效。但是当我试图把它放在存储过程中时,我得到了一些像这样的错误
here's the stored procedure
这是存储过程
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;
then executing it by
然后执行它
select * from table (startLogin('usr','pwd','PAN'));
and here are the errors
这是错误
SQL Error: ORA-00932: inconsistent datatypes: expected - got -
ORA-06512: at "LUKI.STARTLOGIN", line 14
00932. 00000 - "inconsistent datatypes: expected %s got %s"
any idea?
3 个解决方案
#1
Add one more variable below the line
在该行下方再添加一个变量
the_sql varchar(200);
as
yid_user users.id_user%TYPE;
and change your execute immediate as
并立即更改您的执行
execute immediate the_sql into yid_user, the_count;
Also some tips for using variable types in Oracle:
还有一些在Oracle中使用变量类型的技巧:
1. VARCHAR is obsolete, use VARCHAR2 instead.
2. Instead of using INTEGER type, use NUMBER.
#2
Your query returns 2 columns, but there's only one column defined in INTO.
您的查询返回2列,但INTO中只定义了一列。
#3
i already figured it out.. thanks for user4884704 (i've marked his answer already)
我已经想通了..感谢user4884704(我已经标记了他的答案)
so here's the working code..put the results in different variable
所以这是工作代码..将结果输入不同的变量
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;
then i execute it as
然后我执行它
select * from table (startLogin('usr','pwd','PAN'));
#1
Add one more variable below the line
在该行下方再添加一个变量
the_sql varchar(200);
as
yid_user users.id_user%TYPE;
and change your execute immediate as
并立即更改您的执行
execute immediate the_sql into yid_user, the_count;
Also some tips for using variable types in Oracle:
还有一些在Oracle中使用变量类型的技巧:
1. VARCHAR is obsolete, use VARCHAR2 instead.
2. Instead of using INTEGER type, use NUMBER.
#2
Your query returns 2 columns, but there's only one column defined in INTO.
您的查询返回2列,但INTO中只定义了一列。
#3
i already figured it out.. thanks for user4884704 (i've marked his answer already)
我已经想通了..感谢user4884704(我已经标记了他的答案)
so here's the working code..put the results in different variable
所以这是工作代码..将结果输入不同的变量
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;
then i execute it as
然后我执行它
select * from table (startLogin('usr','pwd','PAN'));