如何在 select 的 where 子句中替换 oracle pl/sql 变量

Posted

技术标签:

【中文标题】如何在 select 的 where 子句中替换 oracle pl/sql 变量【英文标题】:How to substitute oracle pl/sql variable in where clause of select 【发布时间】:2014-07-15 13:41:36 【问题描述】:

函数内部,

我有以下功能,

create or replace 
FUNCTION DiffMaxMinPrice
 return double precision
is 
 diffprice double precision := 0;
 minprice long; 
 maxprice long;
 value long;
 indexid number(19,0);
begin

for row in 
 (SELECT  x.* into minprice , maxprice 
       FROM sampletable ,
            XMLTABLE ('//book'
                      PASSING sampletable.xmlcol
                      COLUMNS maxprice VARCHAR2(30) PATH '@maxprice',
                              minprice VARCHAR2(30) PATH '@minprice') x 
                              where sampletable.indexid = 2)
 LOOP
  ....
 END LOOP;


 return 1;
end;

我不想用 2 进行硬编码,而是用变量 idxid 代替。当我在那里替换一个变量时,我总是得到无效的数字。

indexid :=2 而select语句的where部分为

sampletable.indexid = indexid

【问题讨论】:

【参考方案1】:

你可以把它做成一个带参数的光标,像这样:

cursor cs ( pIndexId IN number ) is 
(SELECT  x.* into minprice , maxprice 
           FROM sampletable ,
                XMLTABLE ('//book'
                          PASSING sampletable.xmlcol
                          COLUMNS maxprice VARCHAR2(30) PATH '@maxprice',
                                  minprice VARCHAR2(30) PATH '@minprice') x 
                                  where sampletable.indexid = pIndexId );

csrom cs%rowtype;

然后你将它用作:

open cs( someVariableYouNeed );
loop
    fetch cs into csrom
    exit when cs%NOT_FOUND;

    --do whatever you need here

end loop;
close cs;

如果你的代码中有这个变量,你也可以在你的代码中使用它。它会正常工作的。

for row in 
  (SELECT  x.* into minprice , maxprice 
       FROM sampletable ,
            XMLTABLE ('//book'
                      PASSING sampletable.xmlcol
                      COLUMNS maxprice VARCHAR2(30) PATH '@maxprice',
                              minprice VARCHAR2(30) PATH '@minprice') x 
                              where sampletable.indexid = someVariableYouNeed )

如果您得到:无效数字,这意味着该列不是数字类型,或者您的变量的值不是数字。

【讨论】:

我想用一个变量代替那个 indexid。 indexid 的值来自另一个查询。 这只是一个例子。您可以使用您想要的任何变量来代替 1。我会编辑它。 即使我之前这样分配它也不起作用,indexid := 2; 然后使用它 sampletable.indexid 列的类型是什么?如果您收到此错误,则表示此列不是数字或具有无法隐式转换为数字的值。 minprice、maxprice的类型是如何定义的? into minprice , maxprice

以上是关于如何在 select 的 where 子句中替换 oracle pl/sql 变量的主要内容,如果未能解决你的问题,请参考以下文章

mysql查询的where子句中的正则表达式或替换函数

SQL Server:性能问题:WHERE 子句中的 OR 语句替换

如何使用替换 Where 子句实现以下火花行为

如何在光标的 select 语句 where 子句中传递逗号分隔值

动态 SELECT 和 WHERE 子句

如何在 WHERE 子句中编写带有 SELECT 语句的 SQL DELETE 语句?