sms*_*ran 5 oracle plsql stored-procedures
我在使用 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;
Run Code Online (Sandbox Code Playgroud)
免责声明:以上不是实际的存储过程。我正在使用一个示例来理解 Oracle 中 if else 和本机动态 SQL 的概念。这样你们更容易理解;)
在 PL/SQL 中,分配给变量的零长度字符串varchar2
被视为NULL
.
在您的情况下,如果为 argumentflavour
分配了零长度字符串,则下面的行实际上是将 aNULL
与Something进行比较,这始终为 false。
IF flavour <> '' then
Run Code Online (Sandbox Code Playgroud)
根据您的业务逻辑修复该行以处理 的空值flavour
,这样就可以了。修复示例如下:
if flavour is not null then
Run Code Online (Sandbox Code Playgroud)
希望下面的代码片段能帮助您了解如何处理空字符串和 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
--------------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
在 Oracle 中,空字符串相当于NULL
.
所以你想做:
IF flavour IS NOT NULL THEN
Run Code Online (Sandbox Code Playgroud)
但是,更好的解决方案不是使用动态 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;
/
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
39004 次 |
最近记录: |