EXECUTE IMMEDIATE支持DDL、DCL、DML以及单行SELECT语句,不支持结果集为
多行的查询语句。
GBase 8s PL/SQL手册
南大通用数据技术股份有限公司
- 118 -
如果动态SQL语句包含绑定变量占位符,则每个占位符必须在EXECTURE IMMEDIATE
语句的USING子句有对应的绑定变量。用USING 定义输入变量,USING子句不能使用NULL
作为变量。为了解决此限制,在需要使用NULL的地方使用无初始化的变量来替代。USING
子句不支持select语句。不要有SQL引擎不支持类型的绑定变量。
语法:
EXECUTE IMMEDIATE ---动态SQL的起始标示,表示是动态SQL调用
SQL 子句 ---动态SQL语句
方式1:提前声明一个SQL语句
方式2:可以通过’’添加SQL语句
USING 子句 ---用于定义输入变量
例子
l
提前声明SQL的例子
CREATE OR REPLACE PROCEDURE pro1 AS
sql1 VARCHAR (100);
ret1 VARCHAR (20);
BEGIN
sql1 := 'UPDATE emp SET col=? where id=? '; --提前声明SQL语句
EXECUTE IMMEDIATE sql1 USING 'zhangsan-q',100;
DBMS_OUTPUT.PUT_LINE(ret1);
END;
l
通过’’添加SQL语句例子
CREATE OR REPLACE PROCEDURE pro1 AS
sql1 VARCHAR (100);
ret1 VARCHAR (20);
BEGIN
EXECUTE IMMEDIATE 'UPDATE emp SET col=? where id=? ' USING 'zhangsan-q',100;
DBMS_OUTPUT.PUT_LINE(ret1);
END;
l
使用USING子句的例子
DROP TABLE IF EXISTS emp2;
CREATE TABLE emp2(col1 VARCHAR(20),col2 INT);
DROP PROCEDURE IF EXISTS pro2;
CREATE or REPLACE PROCEDURE pro2(v_col1 varchar(20),v_col2 INT) AS
GBase 8s PL/SQL手册
南大通用数据技术股份有限公司
- 119 -
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO emp2 VALUES(?, ?)' USING v_col1, v_col2;
END;
CALLl pro2( '2232',100);