【问题标题】:Lower function being ignored when used in a function in SQL Oracle在 SQL Oracle 中的函数中使用时忽略较低的函数
【发布时间】:2020-02-06 06:38:51
【问题描述】:

我在 SQL Oracle 中创建不区分大小写的函数时遇到问题。我被要求创建一个名为

的函数
containsText(pString1, pString2)

查找 pString2 是否在 pString1 中。 我正在使用 lower() 函数,但它似乎忽略了命令。如果有人想试试看这里的脚本。

首先创建表:

-- create types --
create or replace type artist_type as object 
(artistName     varchar(50), 
 artistRole     varchar(25))
/ 
create type artist_array_type  
as varray(5) of artist_type
/ 
create or replace type review_type as object 
(reviewerName   varchar(25), 
 reviewDate     date,
 reviewText     varchar(250), 
 reviewScore    number)
/
create or replace type review_table_type as table of review_type
/
create or replace type album_type as object 
(albumTitle         varchar(50),
 albumPlaytime      number(3), -- minutes
 albumReleaseDate   date, 
 albumGenre         varchar(15),
 albumPrice         number(9,2),
 albumTracks        number(2),
 albumArtists       artist_array_type,
 albumReviews       review_table_type,
member function discountPrice return number,
member function containsText (pString1 varchar2, pString2 varchar2) return integer)
not instantiable not final 
/
create or replace type disk_type under album_type 
( mediaType         varchar(10),
 diskNum            number(2), -- number of disks
 diskUsedPrice      number(9,2),
 diskDeliveryCost   number(9,2), 
overriding member function discountPrice return number)
/
create or replace type mp3_type under album_type
(downloadSize   number, -- size in MB
 overriding member function discountPrice return number)
/
-- create tables --
create table albums of album_type 
object id system generated
nested table albumReviews store as store_reviews 
/ 

这是一行数据:

insert into albums 
values (disk_type('The Essential Bob Dylan', 99, '8-Jul-2016', 'Pop', 37.00, 32, 
artist_array_type(artist_type('Bob Dylan', 'Composer'), 
                  artist_type('Bob Dylan', 'Vocals')), 
review_table_type(review_type('Shawn', '24-Jul-2018', 'Wife loved it!', 5), 
                  review_type('Reuben', '2-Aug-2019', 'Great compilation of some of his most known songs', 5)),
'Vinyl', 2, NULL, 11));

函数如下:

create or replace type body album_type
as 
member function discountPrice return number is

    begin 
        return null;
    end discountPrice;

    member function containsText (pString1 varchar2, pString2 varchar2) return integer is

    begin
        if lower(pString1) like lower('%' || pString2 || '%') then 
             return 1;
        else
            return 0;
        end if;
    end containsText;
end;

最后是select语句:

select containsText('This is great', 'Great') from albums

应该返回 1 但返回 0。

此外,我尝试了以下替代 if 语句。

   begin
        if instr(lower(pString1), lower(pString2)) > 0 then 
             return 1;
        else
            return 0;
        end if;
    end containsText;
end;

【问题讨论】:

    标签: sql oracle function if-statement plsql


    【解决方案1】:

    您的代码没有调用成员函数,而是调用了不同的独立函数。使用这样的代码来调用该类型拥有的成员函数:

    select a.containsText('This is great', 'Great') result
    from albums a;
    
    RESULT
    ------
         1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      • 2010-11-25
      • 1970-01-01
      • 1970-01-01
      • 2021-09-27
      相关资源
      最近更新 更多