1

以下存储过程基于搜索类型(id、编号、名称)和搜索文本(“三星银河”或任何其他等)进行产品搜索。让我们假设

search_type 是名称search_text 是“三星银河”

基于此条件,我编写了以下存储过程。

create or replace procedure product_search(
    search_type IN varchar2,
    search_text IN varchar2,
    status IN varchar2)
is
cursor c1 is 
    SELECT p.pm_oid , p.item_name  
        FROM prism_item_hierarchy p
        WHERE 
        CASE search_type
             WHEN 'id' THEN p.pm_oid LIKE '%'||search_text||'%'
             WHEN 'name' THEN  Lower(p.item_name ) LIKE '%'||search_text||'%'
             ELSE p.item_number LIKE '%'||search_text
        END;

BEGIN
    open c1;
    -- fetch c1 into 

    close c1;

 END;

但是我在 case-when-condition 上收到以下错误:

[Error] ORA-00905 (18: 49): PL/SQL: ORA-00905: missing keyword

你能否建议我如何解决这个问题,即使你提出其他方法来解决这个问题,它也会很棒。谢谢

4

1 回答 1

5

这不是在 Oracle 中可以做到的。例如,您可以通过这种方式重写您的查询:

SELECT p.pm_oid , p.item_name  
        FROM prism_item_hierarchy p
        WHERE 
         (search_type='id' AND (p.pm_oid LIKE '%'||search_text||'%')) 
         OR (search_type='name' AND ( Lower(p.item_name ) LIKE '%'||search_text||'%'))
         OR (search_type NOT IN ('id', 'name') AND (p.item_number LIKE '%'||search_text ))

我在这里所做的:我制定了一个传统的逻辑表达式,用于表达您使用该CASE-WHEN-THEN构造所制定的内容。在该WHERE子句中,CASE-WHEN-THEN 不能按照您的方式使用 - 它返回某种值,而您没有对此做任何事情,这就是您收到“缺少关键字”错误的原因。 ..

考虑到这一点,您可以这样做,相应地定义和使用返回值(但请注意,在这种情况下,这是一种扭曲且丑陋的方法!):

SELECT p.pm_oid , p.item_name  
        FROM prism_item_hierarchy p
        WHERE 
        1 = CASE 
                 WHEN search_type='id' AND (p.pm_oid LIKE '%'||search_text||'%') THEN 1
                 WHEN search_type='name' AND (Lower(p.item_name ) LIKE '%'||search_text||'%') THEN 1
                 WHEN search_type NOT IN ('name','id') AND (p.item_number LIKE '%'||search_text) THEN 1
                 ELSE 0
        END;

但我认为您应该使用该IF-THEN-ELSIF-ELSE构造,并将单个查询分成三个查询:

IF search_type = 'id' THEN
    SELECT p.pm_oid , p.item_name  
    FROM prism_item_hierarchy p
    WHERE p.pm_oid LIKE '%'||search_text||'%'

ELSIF search_type = 'name' THEN
    SELECT p.pm_oid , p.item_name  
    FROM prism_item_hierarchy p
    WHERE Lower(p.item_name ) LIKE '%'||search_text||'%'

ELSE
    SELECT p.pm_oid , p.item_name  
    FROM prism_item_hierarchy p
    WHERE p.item_number LIKE '%'||search_text

END IF;

这种方法,因为它使用三个不同的查询更加优化:查询优化器将能够为每个使用不同的配置文件,所以一般来说,您最终会在每个查询上获得增强的性能。

于 2013-03-13T09:44:47.087 回答