在PL / SQL中,如何将动态SQL转换为"安全",非动态SQL?

时间:2014-08-08 03:00:15

标签: sql oracle dynamic-sql

我有一些动态SQL代码,这里是一个样本:

    v_RUNNING_QUERY VARCHAR2(1000);
    BEGIN
    v_RUNNING_QUERY := 'SELECT PBA.PTY_ID FROM PARTY.PARTY_BILLING_ACCOUNT PBA
                                   WHERE PBA.BILLING_ACCT_SRC_ID1 = p_BILLING_ACCT_SRC_SYS
                                   AND 
                                   PBA.BILLING_ACCT_SRC_SYS_CD = p_PBA.BILLING_ACCT_SRC_SYS_CD;
  IF p_BILLING_ACCT_SRC_SYS_ID2 IS NOT NULL
   THEN 
   v_RUNNING_QUERY := v_RUNNING_QUERY || ' AND PBA.BILLING_ACCT_SRC_ID2 = p_BILLING_ACCT_SRC_SYS_ID2';

问题是我的老板要我删除所有动态SQL。取而代之的是,我需要主要使用IF逻辑。但他也说我可以使用COALESCE。我输了...... COALESCE如何帮助解决这个问题?

1 个答案:

答案 0 :(得分:2)

你可以得到与以下相同的逻辑:

SELECT PBA.PTY_ID
FROM PARTY.PARTY_BILLING_ACCOUNT PBA
WHERE PBA.BILLING_ACCT_SRC_ID1 = p_BILLING_ACCT_SRC_SYS AND 
      PBA.BILLING_ACCT_SRC_SYS_CD = p_BILLING_ACCT_SRC_SYS_CD AND
      (p_BILLING_ACCT_SRC_SYS_ID2 IS NULL OR PBA.BILLING_ACCT_SRC_ID2 =  p_BILLING_ACCT_SRC_SYS_ID2)

BILLING_ACCT_SRC_ID2之后,您似乎想要进行一些比较。

编辑:

您也可以将其命名为:

SELECT PBA.PTY_ID
FROM PARTY.PARTY_BILLING_ACCOUNT PBA
WHERE PBA.BILLING_ACCT_SRC_ID1 = p_BILLING_ACCT_SRC_SYS AND 
      PBA.BILLING_ACCT_SRC_SYS_CD = p_BILLING_ACCT_SRC_SYS_CD AND
      PBA.BILLING_ACCT_SRC_ID2 = coalesce(p_BILLING_ACCT_SRC_SYS_ID2, PBA.BILLING_ACCT_SRC_ID2);

这使用coalesce(),但逻辑不需要