Abh*_*ngh 6 oracle plsql oracle-sqldeveloper
execute immediatePL/SQL与DML和DDL语句一起使用时有什么意义?是否execute immediate隐含提交到数据库就像DDL语句呢?
以下是我遇到的一个例子:
SELECT 'TRUNCATE TABLE BD_BIDS_APPR_DET' INTO V_SQL1 FROM DUAL;
EXECUTE IMMEDIATE V_SQL1;
SELECT 'TRUNCATE TABLE BD_BIDS_SYS_DET' INTO V_SQL1 FROM DUAL;
EXECUTE IMMEDIATE V_SQL1;
SELECT 'TRUNCATE TABLE BD_BIDS_EXT_DET' INTO V_SQL1 FROM DUAL;
EXECUTE IMMEDIATE V_SQL1;
Run Code Online (Sandbox Code Playgroud)
Ale*_*ole 10
它用于运行本机动态SQL.
对于DML,您在运行在编译时没有可用的语句时使用它,例如,如果列列表基于用户的选择.
在您的情况下,它被使用,因为DDL不能从PL/SQL中作为静态SQL运行.只有某些查询,DML和TCL命令有效.任何其他东西都必须被视为动态的.
我说很少需要使用PL/SQL块中的DDL.TRUNCATE可能是合理的; 如果您发现任何动态创建或丢弃对象,那么这可能更令人担忧,因为它可能会建议一个次优的数据模型.
EXECUTE IMMEDIATE本身不会自动提交; 但是如果你执行DDL那么它的行为就像你在PL/SQL之外运行一样,所以它会在你的情况下提交,是的.
顺便说一下,我不确定为什么你的代码使用中间变量来保存语句; 如果您想要显示它将要运行的内容,这很有用,但您似乎并没有这样做.你有什么可以做到:
EXECUTE IMMEDIATE 'TRUNCATE TABLE BD_BIDS_EXT_DET';
Run Code Online (Sandbox Code Playgroud)
即V_SQL_1根本不使用.
| 归档时间: |
|
| 查看次数: |
32111 次 |
| 最近记录: |