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