当我跑的时候
SELECT COUNT(*)
INTO l_entry_found
FROM hera.hera_user@iam
WHERE username = docm.eb_key;如果没有execute immediate,它就可以工作。
execute immediate'
SELECT COUNT(*) INTO l_entry_found FROM hera.hera_user@iam WHERE
username = docm.eb_key;';但是抛出了一个ora-00933。
问题可能是什么,我该如何解决它?提前感谢!
发布于 2018-09-07 21:37:42
您不能在动态SQL中使用select into,也不需要分号
declare
l_entry number(10);
begin
execute immediate'
SELECT COUNT(*) FROM hera.hera_user@iam WHERE
username = '''||docm.eb_key||'''' INTO l_entry;
end;发布于 2018-09-07 21:41:43
您有一些问题;假设您有一个表,例如
create table someTable(userName varchar2(100))代码如下所示:
declare
someVariable varchar2(100);
l_entry_found number;
begin
someVariable := 'someName';
--
SELECT COUNT(*)
INTO l_entry_found
FROM someTable
WHERE username = someVariable;
end;如果您希望切换到动态SQL,则需要
INTO移出动态部分你的代码可以是:
declare
someVariable varchar2(100);
l_entry_found number;
begin
someVariable := 'someName';
--
execute immediate
'SELECT COUNT(*)
FROM someTable
WHERE username = :bindVar'
into l_entry_found
using someVariable;
end;在这里,我假设您有充分的理由切换到动态SQL,例如,您的表名可以根据某些参数进行更改;如果不是这样,那么纯SQL对于您的任务就足够好了。
发布于 2018-09-09 18:28:00
EXECUTE IMMEDIATE语句执行动态SQL语句或匿名PL/SQL块。您可以使用它发出不能直接在PL/SQL中表示的SQL语句,或者预先构建不知道所有表名、where子句等的语句

继续你的问题
-- Case using 1 output column 'COUNT(*)', 1 filter variable 'eb_key'
DECLARE
--
eb_key VARCHAR2(100) := 'something';
l_entry_found number;
--
BEGIN
execute immediate 'SELECT COUNT(*) FROM hera.hera_user@iam WHERE username = :eb_key;' USING eb_key INTO l_entry_found;
END;
-- Case using 2 output column 'COUNT(*)', 3 filter variable 'eb_key'
DECLARE
--
eb_column1 VARCHAR2(100) := 'something';
eb_column2 VARCHAR2(100) := 'something';
l_entry_found1 number;
l_entry_found2 number;
--
BEGIN
execute immediate 'SELECT column1, column2 FROM hera.hera_user@iam WHERE username = :eb_1 AND lastname = :eb_2;' USING eb_column1, eb_column2 INTO l_entry_found1,l_entry_found2;
END;https://stackoverflow.com/questions/52223555
复制相似问题