动态sql用于以下查询

时间:2018-03-15 06:00:46

标签: oracle plsql dynamic-sql

有人可以帮我将以下查询转换为动态sql。

我需要将以下查询放在PL / SQL过程中。

查找具有非活动Bacs的客户的关系

CREATE TABLE INACTIVE_CUS_ID AS
SELECT * FROM
(SELECT
CUST.CUSTOMER_ID ,
case when sum(case when NVL(BAC.ACCOUNT_STATUS,'A')='I' then 0 else 1 end ) >0 then 'Y'
else 'N' end CUS_HAVE_LIVE_BAC_FLG ,
max(to_date(SUBSTR(NVL(BAC.UPDATE_TS,SYSDATE),1,10),'YYYY-MM-DD')) as LAST_BAC_CEASE_DATE
FROM
OPS$QDW.PSO_CUSTOMER CUST ,
OPS$QDW.PSO_CUST_BLNG_ACCT BAC    
where CUST.CUSTOMER_ID = BAC.CUSTOMER_ID GROUP BY CUST.CUSTOMER_ID)
where CUS_HAVE_LIVE_BAC_FLG ='N'
AND LAST_BAC_CEASE_DATE < SYSDATE -730;

1 个答案:

答案 0 :(得分:1)

您没有提到为什么要在过程中运行create table而不是直接使用SQL语句。您可能想要将参数传递给您的过程并在DDL中使用变量吗?

我们无法在程序中直接运行DDL。您可以将EXECUTE IMMEDIATE用于此类目的。

在下面的示例中,该过程具有表名称的两个参数以及要在select语句中使用的一些其他值。

绑定参数可以用于值(使用USING关键字),但只有变量连接可以用于动态表名和列名。

CREATE OR REPLACE PROCEDURE yourprocedure (p_table_name    VARCHAR2,
                                           p_arg1          VARCHAR2,
                                           p_arg2          NUMBER)
AS
BEGIN
   EXECUTE IMMEDIATE
         'Create table yourtablename as select col1,col2 from '
      || othertable
      || '  where somothercol1 = :x AND somothercol2 = :y'
      USING p_arg1, p_arg2;
END;
/