如何在Oracle SQL中将多个值作为单个参数传递
我正在尝试更新具有相同表名的多个模式中的值 所以我尝试创建一个查询,将多个值作为单个参数传递,但它不起作用。请推荐我如何在Oracle SQL中将多个值作为单个参数传递,sql,string,oracle,plsql,Sql,String,Oracle,Plsql,我正在尝试更新具有相同表名的多个模式中的值 所以我尝试创建一个查询,将多个值作为单个参数传递,但它不起作用。请推荐我 DECLARE v_sql varchar2(500); v_schema varchar(30); v_prj_id varchar2(4000); in_PRJ_ID varchar2(4000); v_prj_id := 'B00781728,B00781628,B00781611,A43670001'; CURSOR c1
DECLARE
v_sql varchar2(500);
v_schema varchar(30);
v_prj_id varchar2(4000);
in_PRJ_ID varchar2(4000);
v_prj_id := 'B00781728,B00781628,B00781611,A43670001';
CURSOR c1 is
SELECT v_prj_id from DUAL;
BEGIN
OPEN c1;
FOR i IN (SELECT trim(regexp_substr(v_prj_id, '[^,]+', 1, LEVEL)) l FROM dual CONNECT BY LEVEL <= regexp_count(v_prj_id, ',') + 1 ) LOOP
FETCH c1 INTO in_PRJ_ID;
EXIT WHEN c1%NOTFOUND;
v_sql := 'UPDATE ' || in_PRJ_ID || '.SI_Recipient set email = email ||'';Seshadri.K@iconplc.com''' ;
EXECUTE IMMEDIATE v_sql;
END LOOP;
CLOSE c1;
END;
这项工作:
Declare
v_sql varchar2(500);
v_schema varchar(30);
v_prj_id varchar2(4000):='B00781728,B00781628,B00781611,A43670001';
BEGIN
Dbms_Output.Put_Line('v_prj_id='||v_prj_id);
--
FOR i IN (SELECT trim(regexp_substr(v_prj_id, '[^,]+', 1, LEVEL)) l
FROM dual
CONNECT BY LEVEL <= regexp_count(v_prj_id, ',') + 1
) LOOP
--
Dbms_Output.Put_Line('---------------------');
--
--
v_sql := 'UPDATE ' || i.l|| '.SI_Recipient set email = email ||'';Seshadri.K@iconplc.com''' ;
--
Dbms_Output.Put_Line('v_sql='||v_sql);
--
begin
EXECUTE IMMEDIATE v_sql;
Exception
when others then
Dbms_Output.Put_Line('sqlerrm='||sqlerrm);
End;
--
END LOOP;
END;
/
因为在我的oracle实例中,我没有架构B00781728、B00781628、B00781611、A43670001,所以我得到错误ORA-00942表或视图不存在。对值使用集合或变量,这样就不必拆分分隔字符串,并且可以对希望附加到电子邮件字符串的值使用绑定参数:
声明
v_sql varchar2500;
v_模式varchar30;
v_prj_id varchar24000;
在ID SYS.ODCIVARCHAR2列表中:=SYS.ODCIVARCHAR2列表“B00781728”、“B00781628”、“B00781611”、“A43670001”;
开始
因为我在1。。in_PRJ_ID.COUNT循环
v|U sql:=“更新”在|PRJ|u IDi||中。SI|u收件人”
||'设置电子邮件=电子邮件| | | | |:地址';
开始
使用“Seshadri”执行即时v_sql。K@iconplc.com';
例外
当其他人
DBMS_OUTPUT.PUT_LINE SQLERRM;
终止
端环;
终止
/
产出:
dbfiddle当你说它不工作时,那是什么意思?它不编译吗?它是否引发运行时异常?它运行但什么也不做吗?请记住,我们无法看到您的屏幕,我们没有您的环境,我们无法运行您的代码。我们只知道你告诉我们的。请参阅帮助部分。以此作为模板,可以大大提高您获得满意答案的机会。至少发布您的表DDL,并用业务术语而不是SQL术语描述您试图实现的目标。所有答案都使用您的值,它们表示表名;当然,这是从你最初的帖子开始的。重申APC不起作用,当然,如果是的话,你就不会寻求帮助。但为什么它不起作用呢。如果我只是说:it's not right会给你同样数量的信息,但是非常有用。Shi@alvalongo非常感谢你的提问。。成功了。我还有一个问题。我需要在更新语句中添加where条件,如下所示:v_prj_id=B00781728、B00781628、B00781611、A43670001 v_event=A、B、C、D;i、 e对于B00781728=A、B00781628=B、B00781611=C和A43670001=D-------v_sql=UPDATE B00781728.SI_收件人集email=email | |;塞沙德里。K@iconplc.com'其中EVENT=V_EVENT与此类似,我需要打印这些结果的输出。
v_prj_id=B00781728,B00781628,B00781611,A43670001
---------------------
v_sql=UPDATE B00781728.SI_Recipient set email = email ||';Seshadri.K@iconplc.com'
sqlerrm=ORA-00942: la tabla o vista no existe
---------------------
v_sql=UPDATE B00781628.SI_Recipient set email = email ||';Seshadri.K@iconplc.com'
sqlerrm=ORA-00942: la tabla o vista no existe
---------------------
v_sql=UPDATE B00781611.SI_Recipient set email = email ||';Seshadri.K@iconplc.com'
sqlerrm=ORA-00942: la tabla o vista no existe
---------------------
v_sql=UPDATE A43670001.SI_Recipient set email = email ||';Seshadri.K@iconplc.com'
sqlerrm=ORA-00942: la tabla o vista no existe
Total execution time 344 ms
UPDATE B00781728.SI_Recipient set email = email || ';' || :addr
ORA-00942: table or view does not exist
UPDATE B00781628.SI_Recipient set email = email || ';' || :addr
ORA-00942: table or view does not exist
UPDATE B00781611.SI_Recipient set email = email || ';' || :addr
ORA-00942: table or view does not exist
UPDATE A43670001.SI_Recipient set email = email || ';' || :addr
ORA-00942: table or view does not exist