是否可以在一个EXECUTE IMMEDIATE块中执行一些sql命令?
这种语法有什么问题:
declare
pragma autonomous_transaction;
begin
execute immediate
'begin
COMMENT ON TABLE t1 IS ''description1'';
COMMENT ON TABLE t2 IS ''description2'';
end;';
end;
Run Code Online (Sandbox Code Playgroud)
对于一个SQL命令,它工作正常:
declare
pragma autonomous_transaction;
begin
execute immediate ' COMMENT ON TABLE t1 IS ''description1'' ';
end;
Run Code Online (Sandbox Code Playgroud) 我坚持这个非常简单的脚本.它不像我期望的那样工作.
declare
st VARCHAR(1024);
begin
for x in (SELECT sequence_name FROM USER_SEQUENCES) loop
st := 'ALTER SEQUENCE ' || x.sequence_name || ' INCREMENT BY 1000';
execute immediate st;
st := 'select ' || x.sequence_name || '.nextval from dual';
execute immediate st;
st := 'ALTER SEQUENCE ' || x.sequence_name || ' INCREMENT BY 1';
execute immediate st;
end loop;
end;
/
Run Code Online (Sandbox Code Playgroud)
当我运行它时它似乎根本不起作用 - 我的所有序列都保持不变,并且它们没有被动态语句增加一千.如果我nextval在匿名阻止之前和之后检查,差异只有1,而不是1001.
如果我更换execute immediate用dbms_output.put_line,并执行生成的命令手动序列被改变,因为我想.
我错过了什么?
DECLARE
max_id INTEGER;
BEGIN
SELECT MAX(ID) + 1 INTO max_id FROM MY_TABLE;
EXECUTE IMMEDIATE 'CREATE SEQUENCE MY_TABLE_ID MINVALUE 1 MAXVALUE 99999999999999 INCREMENT BY 1 START WITH ' || max_id || ' CACHE 100 NOORDER NOCYCLE NOPARTITION';
END;
Run Code Online (Sandbox Code Playgroud)
上面给我ORA-00933: SQL command not properly ended执行时
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
PL/SQL Release 12.2.0.1.0 - Production
Run Code Online (Sandbox Code Playgroud)
并且无误地工作
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
PL/SQL Release 12.1.0.2.0 - Production
Run Code Online (Sandbox Code Playgroud)
将execute语句更改为以下后,它适用于两个版本,没有任何错误.
CREATE SEQUENCE MY_TABLE_ID …Run Code Online (Sandbox Code Playgroud) 我想在ref_cursor中得到结果,但我无法做到这一点.
请建议我如何使用Execute immediate在ref_cursor中获取结果
CREATE OR REPLACE PROCEDURE TEST_PROC_QT ( p_name IN VARCHAR2,
p_result_set OUT sys_refcursor ) IS
v_sql VARCHAR2(4000);
BEGIN
v_sql := '';
v_sql := 'SELECT * FROM USERS WHERE 1=1 ';
IF p_name is not null THEN
v_sql := v_sql || ' AND login_id = :v_name';
ELSE
v_sql := v_sql || ' AND ((1=1) or :v_name is null)';
END IF;
Dbms_output.put_line(v_sql);
EXECUTE IMMEDIATE v_sql
--OPEN p_result_set for v_sql
--INTO p_result_set using p_name;
END;
Run Code Online (Sandbox Code Playgroud) 为什么execute immediate 'truncate table trade_economics';在 sqlplus 脚本中会出现以下错误?
BEGIN immediate 'truncate table trade_economics'; END;
*
ERROR at line 1:
ORA-06550: line 1, column 17:
PLS-00103: Encountered the symbol "truncate table trade_economics" when
expecting one of the following:
:= . ( @ % ;
The symbol ":=" was substituted for "truncate table trade_economics" to
continue.`
Run Code Online (Sandbox Code Playgroud) 我在Oracle中遇到了一些问题.我尝试创建一个序列,用于在已包含数据的表中生成ID.我尝试使用以下匿名块.
declare y varchar2(2000);
BEGIN
SELECT 'CREATE SEQUENCE ID_SEQ MINVALUE 1 MAXVALUE 9999999999 START WITH ' || (max(ID)+1) || ' INCREMENT BY 1 CACHE 20;' INTO y FROM TEST_TABLE;
--dbms_output.put_line(y);
execute immediate y;
end;
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Error report:
ORA-00911: invalid character
ORA-06512: at line 5
00911. 00000 - "invalid character"
Run Code Online (Sandbox Code Playgroud)
如果我执行y变量的值,它就可以完美地运行.我正在使用SQL Developer作为输入接口并在11g r2 Oracle服务器上工作.我找到了类似的代码,其中'INCREMENT BY'参数是脚本生成的.有人可以解释我的错误吗?
基于这个答案,我试图创建临时表,但是我得到异常ORA-00942:table or view does not exist我会认为'CREATE OR REPLACE GLOBAL TEMPORARY TABLE TempQandA(column1 number) ON COMMIT PRESERVE ROWS'语句有问题,它失败了insert into TempQandA(column1) VALUES (1);.
请在下面找到SQL语句.
DECLARE
TransactioDetailId numeric := 3132;
HomePhoneNumber varchar(20);
MobileNumber varchar(20);
Email varchar(20);
whatever varchar(20);
BEGIN
EXECUTE IMMEDIATE 'CREATE OR REPLACE GLOBAL TEMPORARY TABLE TempQandA(column1 number) ON COMMIT PRESERVE ROWS';
BEGIN
SELECT contactvalue into HomePhoneNumber FROM customercontact CC
inner join TRANSACTIONMAIN tm on tm.customerid = CC.customerid
inner join transactiondetail td on td.transactionid …Run Code Online (Sandbox Code Playgroud) 我需要创建一个过程,它将从一个模式中的表中删除所有数据.我尝试过类似的东西
CREATE OR REPLACE PROCEDURE CLEAR_ALL
IS
sql_truncate VARCHAR2(50);
cursor c1 is
SELECT table_name
FROM all_tables
WHERE owner = 'KARCHUDZ_S';
BEGIN
sql_truncate := 'TRUNCATE TABLE :text_string';
FOR table_name in c1
LOOP
EXECUTE IMMEDIATE sql_truncate USING table_name;
END LOOP;
END CLEAR_ALL;
Run Code Online (Sandbox Code Playgroud)
但它给了我两个我无法理解和修复的错误.
错误(13,7):PL/SQL:语句被忽略
错误(13,44):PLS-00457:Statment必须是SQL的类型< - (这个错误我必须翻译,因为我使用大学Oracle 11g基础有波兰语lang)
我目前收到此错误 ORA-06550 PLS-00103 遇到符号“VERSION”...
任何人都可以帮我解决这个问题吗?非常感激!
declare
sql_stmnt VARCHAR(200);
lsparameter varchar(50);
lsparameterdata varchar(20);
begin
sql_stmnt := 'SELECT parameter, parameter_data into lsparameter, lsparameterdata FROM MyTable WHERE parameter = 'version'';
EXECUTE IMMEDIATE sql_stmnt;
end;
Run Code Online (Sandbox Code Playgroud)
我知道我已经在 where 子句中将参数设置为“version”。我想从 MyTable 检索参数和parameter_data 以检查版本,然后继续执行函数的其余部分。
提前致谢。
您好,以下是我的代码.我需要使用视图中的数据创建一个视图并在另一个游标中获取数据.但是当我执行我的代码时,我收到错误
"ORA-06550:第56行,第37列:PL/SQL:ORA-00942:表或视图不存在ORA-06550:第52行,第9列:PL/SQL:忽略SQL语句"
这是什么问题?提前致谢.
declare
drop_view_sql varchar2(100) := 'drop view rv_task_number_view';
type tasks_rec is record(task_number varchar2(20));
type t_tab is table of tasks_rec;
tasks_tab t_tab;
notes_rec xx_fs_mob_loc_rec.task_notes_rec;
notes_tab xx_fs_mob_loc_rec.task_notes_tab;
begin
execute immediate 'create view apps.rv_task_number_view as
SELECT distinct ct.task_number
FROM csf_ct_tasks ct ,
cs_estimate_details ced,
csf_debrief_headers cdh,
csf_debrief_lines cdl,
jtf_task_assignments jta
WHERE 1=1
and jta.task_id = ct.task_id
and jta.task_assignment_id = cdh.task_assignment_id(+)
and cdh.debrief_header_id = cdl.debrief_header_id(+)
and cdl.debrief_line_id = ced.source_id(+)
AND ((ct.planned_end_date between (sysdate-30) and (sysdate+30)) or (ct.scheduled_end_date between (sysdate-30) and (sysdate+30)))
and …Run Code Online (Sandbox Code Playgroud) 我有问题动态调用存储过程
\n\n v_sql := 'begin '|| p_procname || '(''test1'','' test2 '',:v_output2); end;';\n execute immediate v_sql\n using out v_output2 ;\n dbms_output.put_line(v_output2 || ' ' );\nRun Code Online (Sandbox Code Playgroud)\n\n在这里 \xc4\xb1 可以调用立即执行的过程。\n但我的问题是动态绑定变量。该值来自日志表,然后我解析execute_immediate 过程
\n\n v_sql := 'begin '|| p_procname || '(''test1'','' test2'',:v_output2); end;';\n v_sql1:= ||using|| 'out v_output2 ' ;\n\n execute immediate v_sql\n v_sql1;\nRun Code Online (Sandbox Code Playgroud)\n\n它不是那样工作的。我如何使动态变量绑定,因为我调用了很多过程,并且该过程具有不同的输入和输出参数。\n我希望你能理解我遇到的问题。我该如何解决这个问题,谢谢
\n我试图execute immediate用作分配变量值的特殊要求.我使用以下代码并获得如下异常.
declare
lv_kyc_main_GBL KYC_GBL_MAIN.KYC_MAIN%rowtype;
l_str varchar2(400);
a number(10);
begin
select *
into lv_kyc_main_GBL
from KYC_GBL_MAIN.KYC_MAIN
where rownum = 1;
-- l_str:='lv_kyc_main_GBL.legal_name'||':='||'''TEST''';
l_str := 'lv_kyc_main_GBL.legal_name := ''TEST''';
dbms_output.put_line(l_str);
execute immediate (l_str);
end;
/
Run Code Online (Sandbox Code Playgroud)
我得到的例外是:
anonymous block completed
lv_kyc_main_GBL.legal_name := 'TEST'
Run Code Online (Sandbox Code Playgroud)
在命令的第4行开始出错:
declare
lv_kyc_main_GBL KYC_GBL_MAIN.KYC_MAIN%rowtype;
l_str varchar2(400);
a number(10);
begin
select *
into lv_kyc_main_GBL
from KYC_GBL_MAIN.KYC_MAIN
where rownum = 1;
--l_str:='lv_kyc_main_GBL.legal_name'||':='||'''TEST''';
l_str := 'lv_kyc_main_GBL.legal_name := ''TEST''';
dbms_output.put_line(l_str);
execute immediate (l_str);
end;
/
Error report:
ORA-00900: invalid SQL statement
ORA-06512: …Run Code Online (Sandbox Code Playgroud)