存储过程PL SQL如果String为空

时间:2016-05-23 10:08:36

标签: oracle stored-procedures plsql

我遇到了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的概念。所以你们更容易理解;)

4 个答案:

答案 0 :(得分:4)

在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;
/

答案 1 :(得分:3)

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

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

IF flavour <> '' then

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

if flavour is not null then

答案 2 :(得分:2)

您可以尝试这样:

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

答案 3 :(得分:2)

希望下面的代码片段可以帮助您了解如何处理空字符串和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

--------------------------------------------------------------------------------