PARSE 过程 - 解析 SQL 语句
PARSE 过程解析 SQL 语句。
如果 SQL 命令是 DDL 命令,那么会直接执行该命令而不需要运行 EXECUTE 过程。
语法
参数
- c
- 类型为 INTEGER 的输入自变量,用于指定已打开游标的标识。
- statement
- 要解析的 SQL 语句。
- language_flag
- 提供此自变量是为了与 Oracle 语法兼容。使用值 1 或
DBMS_SQL.native。
权限
对 DBMS_SQL 模块的 EXECUTE 特权。
使用说明
可通过在 PL/SQL 赋值语句中使用函数调用语法来调用此过程。
示例
示例 1:以下匿名块创建表
job。请注意,PARSE 过程会直接执行 DDL 语句而不需要执行单独的 EXECUTE 步骤。SET SERVEROUTPUT ON@
BEGIN
DECLARE curid INTEGER;
CALL DBMS_SQL.OPEN_CURSOR(curid);
CALL DBMS_SQL.PARSE(curid, 'CREATE TABLE job (jobno DECIMAL(3),
' || 'jname VARCHAR(9))', DBMS_SQL.native);
CALL DBMS_SQL.CLOSE_CURSOR(curid);
END@
此示例生成以下输出:
SET SERVEROUTPUT ON
DB20000I The SET SERVEROUTPUT command completed successfully.
BEGIN
DECLARE curid INTEGER;
CALL DBMS_SQL.OPEN_CURSOR(curid);
CALL DBMS_SQL.PARSE(curid, 'CREATE TABLE job (jobno DECIMAL(3), ' ||
'jname VARCHAR(9))', DBMS_SQL.native);
CALL DBMS_SQL.CLOSE_CURSOR(curid);
END
DB20000I The SQL command completed successfully.示例 2:以下代码在表
job 中插入两行。BEGIN
DECLARE curid INTEGER;
DECLARE v_sql VARCHAR(50);
DECLARE v_status INTEGER;
CALL DBMS_SQL.OPEN_CURSOR(curid);
SET v_sql = 'INSERT INTO job VALUES (100, ''ANALYST'')';
CALL DBMS_SQL.PARSE(curid, v_sql, DBMS_SQL.native);
CALL DBMS_SQL.EXECUTE(curid, v_status);
CALL DBMS_OUTPUT.PUT_LINE('Number of rows processed: ' || v_status);
SET v_sql = 'INSERT INTO job VALUES (200, ''CLERK'')';
CALL DBMS_SQL.PARSE(curid, v_sql, DBMS_SQL.native);
CALL DBMS_SQL.EXECUTE(curid, v_status);
CALL DBMS_OUTPUT.PUT_LINE('Number of rows processed: ' || v_status);
CALL DBMS_SQL.CLOSE_CURSOR(curid);
END@此示例生成以下输出:
BEGIN
DECLARE curid INTEGER;
DECLARE v_sql VARCHAR(50);
DECLARE v_status INTEGER;
CALL DBMS_SQL.OPEN_CURSOR(curid);
SET v_sql = 'INSERT INTO job VALUES (100, ''ANALYST'')';
CALL DBMS_SQL.PARSE(curid, v_sql, DBMS_SQL.native);
CALL DBMS_SQL.EXECUTE(curid, v_status);
CALL DBMS_OUTPUT.PUT_LINE('Number of rows processed: ' || v_status);
SET v_sql = 'INSERT INTO job VALUES (200, ''CLERK'')';
CALL DBMS_SQL.PARSE(curid, v_sql, DBMS_SQL.native);
CALL DBMS_SQL.EXECUTE(curid, v_status);
CALL DBMS_OUTPUT.PUT_LINE('Number of rows processed: ' || v_status);
CALL DBMS_SQL.CLOSE_CURSOR(curid);
END
DB20000I The SQL command completed successfully.
Number of rows processed: 1
Number of rows processed: 1示例 3:以下匿名块使用 DBMS_SQL
模块执行包含两个 INSERT 语句的块。请注意,块结尾包含终止分号,而先前示例中的各个 INSERT 语句没有终止分号。
BEGIN
DECLARE curid INTEGER;
DECLARE v_sql VARCHAR(100);
DECLARE v_status INTEGER;
CALL DBMS_SQL.OPEN_CURSOR(curid);
SET v_sql = 'BEGIN ' || 'INSERT INTO job VALUES (300, ''MANAGER''); '
|| 'INSERT INTO job VALUES (400, ''SALESMAN''); ' || 'END;';
CALL DBMS_SQL.PARSE(curid, v_sql, DBMS_SQL.native);
CALL DBMS_SQL.CLOSE_CURSOR(curid);
END@此示例生成以下输出:
BEGIN
DECLARE curid INTEGER;
DECLARE v_sql VARCHAR(100);
DECLARE v_status INTEGER;
CALL DBMS_SQL.OPEN_CURSOR(curid);
SET v_sql = 'BEGIN ' || 'INSERT INTO job VALUES (300, ''MANAGER''); ' ||
'INSERT INTO job VALUES (400, ''SALESMAN''); ' || 'END;';
CALL DBMS_SQL.PARSE(curid, v_sql, DBMS_SQL.native);
CALL DBMS_SQL.CLOSE_CURSOR(curid);
END
DB20000I The SQL command completed successfully.