存储过程 PL SQL 如果字符串为空

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 的概念。这样你们更容易理解;)

Erk*_*lat 9

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

在您的情况下,如果为 argumentflavour分配了零长度字符串,则下面的行实际上是将 aNULLSomething进行比较,这始终为 false。

IF flavour <> '' then
Run Code Online (Sandbox Code Playgroud)

根据您的业务逻辑修复该行以处理 的空值flavour,这样就可以了。修复示例如下:

if flavour is not null then
Run Code Online (Sandbox Code Playgroud)


Avr*_*Roy 9

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


MT0*_*MT0 5

在 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)