我正在使用Oracle 11g Db,在编写Oracle语法时遇到了麻烦。
我正在尝试将数字变量传递给我的select查询,并将select查询填充到游标。
Declare yr_nr NUMBER;
Begin
yr_nr := 2014;
SELECT DCD.CCY ID, DCD.CCYCDDSC DSC
FROM CCYDCD DCD, CCYEXC EXC
WHERE DCD.CCY = EXC.CCY
AND EXC.YEARNR = yr_nr
End
此选择查询返回80条记录。如何重写这种语法。
答案 0 :(得分:0)
好的,所以你在这里有一个匿名块,块中发生的一切都停留在那个块中。有点像拉斯维加斯。
换句话说,没有什么可以处理查询的结果集。当你这样做时:
declare
[varName] [type]
begin
select foo from bar where column = var ; <--- this has no place to go!
end
当您处于sqlPlus提示符时,sqlPlus有一个默认的记录集处理程序,然后处理返回的记录集并将其打印到屏幕上。
当您使用任何第三方工具(如JDBC或Oracle自己的OCI库)时,它们会提供一个记录集处理程序,然后通过适当的调用来解析它们以获取数据,例如:
rs.getInteger([query],[column] ) //which returns the specific value.
该匿名块本质上是一个存储过程。所以你必须要对结果集做些什么。这是你得到的错误“进入”错误的原因。
如果另一方面你做了类似的事情:
declare
[varName] [type]
result number ;
begin
select count(foo) into result from bar where column = var ;
end
变量结果的值为80,因为这是获取的记录数。
declare
[varName] [type]
cursor thisCursor(p1 in number ) is select foo from bar where column = p1 ;
begin
for rec in thisCursor(varName) loop
If rec.column = [some value] then
doSomething
end if ;
end loop ;
end
这样做可以让你对结果集做些什么。