【问题标题】:Stored Procedure PL SQL If String Is blank存储过程 PL SQL 如果字符串为空
【发布时间】:2016-09-20 03:58:21
【问题描述】:

我遇到了 Oracle 存储过程的问题。 if else 语句没有检查字符串是否为空。还是我做错了?

create or replace PROCEDURE GET_ICECREAM
(
   flavour IN VARCHAR2,
   toppings IN VARCHAR2,
   cursorIC OUT sys_refcursor
)
AS

dynaQuery VARCHAR2(8000);

BEGIN

dynaQuery := 'SELECT price FROM tblIceCream';

IF flavour <> '' THEN

   dynaQuery := dynaQuery || ' WHERE flavour LIKE '''%''' '

ENDIF



OPEN cursorIC FOR dynaQuery;

END GET_ICECREAM;

免责声明:以上不是实际的存储过程。我正在使用一个示例来了解 Oracle 中 if else 和本机动态 SQL 的概念。让你们更容易理解;)

【问题讨论】:

    标签: oracle stored-procedures plsql


    【解决方案1】:

    希望下面的 sn-p 可以帮助您了解如何处理空字符串和 NULL 值。

    SET serveroutput ON;
    DECLARE
      lv_var VARCHAR2(100):='';
    BEGIN
      IF lv_var IS NULL THEN
        dbms_output.put_line('is null');
      ELSE
        dbms_output.put_line('av');
      END IF;
    END;
    
    ------------------------------------OUTPUT--------------------------------------
    
    PL/SQL procedure successfully completed.
    
    is null
    
    --------------------------------------------------------------------------------
    
    SET serveroutput ON;
    DECLARE
      lv_var VARCHAR2(100):='';
    BEGIN
      IF lv_var = '' THEN
        dbms_output.put_line('is null');
      ELSE
        dbms_output.put_line('av');
      END IF;
    END;
    
    --------------------------------------output-----------------------------------
    PL/SQL procedure successfully completed.
    
    av
    
    --------------------------------------------------------------------------------
    

    【讨论】:

      【解决方案2】:

      在 PL/SQL 中,分配给 varchar2 变量的零长度字符串被视为 NULL

      在您的情况下,如果参数flavour 被分配了一个零长度字符串,那么下面的行实际上是将NULLsomething 进行比较,这总是错误的。

      IF flavour <> '' then
      

      根据您的业务逻辑修复该行以处理 flavour 的空值,您会没事的。一个示例修复是:

      if flavour is not null then
      

      【讨论】:

        【解决方案3】:

        在Oracle中,空字符串等价于NULL

        所以你想做:

        IF flavour IS NOT NULL THEN
        

        不过,更好的解决方案是不使用动态SQL,而是重写WHERE过滤器:

        create or replace PROCEDURE GET_ICECREAM
        (
           flavour IN VARCHAR2,
           topping IN VARCHAR2,
           cursorIC OUT sys_refcursor
        )
        AS
        BEGIN
          OPEN cursorIC FOR
          SELECT price
          FROM   tblIceCream
          WHERE  ( flavour IS NULL OR your_flavour_column LIKE '%' || flavour || '%' )
          AND    ( topping IS NULL or your_topping_column LIKE '%' || topping || '%' );
        END GET_ICECREAM;
        /
        

        【讨论】:

          【解决方案4】:

          你可以这样试试:

          IF NVL(flavour, 'NULL') <> 'NULL'
          

          【讨论】:

            猜你喜欢
            • 2017-06-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-10-12
            • 2011-04-29
            • 2023-03-25
            • 1970-01-01
            • 2012-06-12
            相关资源
            最近更新 更多