如何在 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 变量的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server:性能问题:WHERE 子句中的 OR 语句替换