首页 > 解决方案 > 如何在pl/sql中使用动态sql?

问题描述

我以以下 pl/sql 过程为例(我的过程要大得多,但我的问题是关于动态 sql)。我的问题是如何在 SQL_STMT 中使用变量 V_DATE:

CREATE OR REPLACE PROCEDURE TEST (DATE_A IN DATE) IS    
   V_DATE DATE;    
   SQL_STMT VARCHAR2(4000);    
BEGIN     
   V_DATE = DATE_A;
   SQL_STMT = 'CREATE TABLE TABLE_1 AS 
               SELECT * 
                 FROM TABLE_2 A 
                WHERE A.DATE_FROM = V_DATE';
    
   EXECUTE IMMEDIATE SQL_STMT;
   COMMIT;        
END TEST;
/

标签: sqloracleplsqldynamic-sql

解决方案


您需要连接该值。(通常绑定变量是个好主意,但它们不能与 DDL 一起使用。)

create or replace procedure test
    ( date_a in date )
as
    sql_stmt varchar2(4000);
begin
    sql_stmt :=
        'create table table_1 as select * from table_2 a '||
        'where a.date_from = date '''||to_char(date_a,'YYYY-MM-DD')||'''';

    dbms_output.put_line(sql_stmt);
    execute immediate sql_stmt;
end test;

生成的语句将类似于:

create table table_1 as select * from table_2 a where a.date_from = date '2021-03-27'

请注意,这只会工作一次,因为之后表已经存在,因此create table语句将失败,但这只是演示语法的示例。


推荐阅读