我有以下SELECT,我想将其更改为匿名块(需要在Java中使用匿名块,并且无法访问创建的存储功能),以便将文字的使用删除为绑定变量:
SELECT IL.LAT_NUM, IL.LNGTD_NUM
FROM ITEM_LOCATION IL
WHERE IL.ITEM_ID = 294341;
我创建了两个匿名块但无法找到如何返回在两者中创建的值:
1)
DECLARE
itemID number;
latitude number;
longitude number;
BEGIN
itemID := 294341;
SELECT
IL.LAT_NUM,
IL.LNGTD_NUM,
INTO
latitude,
longitude,
FROM
ITEM_LOCATION IL
WHERE
IL.ITEM_ID = itemID ;
END;
2)
DECLARE
TYPE t_ref_cursor IS REF CURSOR;
c_cursor t_ref_cursor;
itemID number;
latitude ITEM_LOCATION.LAT_NUM%TYPE;
longitude ITEM_LOCATION.LNGTD_NUM%TYPE;
BEGIN
itemID := 294341;
OPEN c_cursor FOR
SELECT
IL.LAT_NUM,
IL.LNGTD_NUM,
FROM
ITEM_LOCATION IL
WHERE
IL.ITEM_ID = itemID ;
CLOSE c_cursor;
END;
有谁知道这两个块中的任何一个/两个都可以返回,就好像它是上面的SELECT一样?
答案 0 :(得分:1)
我想更改为匿名块...以删除 将文字用于绑定变量
为什么您认为需要使用匿名块来使用绑定变量?无论如何,你的两个块仍然具有硬编码的值294341
;你的select
在块中使用了一个绑定变量,但每次真正改进你的内容时都会生成一个新的块吗?
正如@haki在几个小时前说的那样,你只需使用带有绑定变量的预准备语句:
PreparedStatement pStmt = conn.prepareStatement(
"SELECT IL.LAT_NUM, IL.LNGTD_NUM :
+ "FROM ITEM_LOCATION IL "
+ "WHERE IL.ITEM_ID = ?");
pStmt.setInt(1, 294341);
...然后执行查询并处理结果集,因为您可能已经是。 (从您对haki的评论的回复中,您似乎混淆了一个准备好的语句 - 这是一个Java / JDBC构造 - 在数据库中有一个存储过程。)
这是针对演示HR
架构的EMP
表的简单独立示例:
import java.sql。; import java.text。; import oracle.jdbc。*; import oracle.jdbc.pool.OracleDataSource;
public class JamesGallagher
{
public static void main(String args[]) throws SQLException
{
Connection conn;
OracleDataSource ds = new OracleDataSource();
ds.setURL("jdbc:oracle:thin:scott/oracle@127.0.0.1:1521:orcl");
conn = ds.getConnection();
PreparedStatement pStmt = conn.prepareStatement(
"select ename, sal from emp where sal > ?");
pStmt.setInt(1, Integer.parseInt(args[0]));
ResultSet rs = pStmt.executeQuery();
while (rs.next())
{
System.out.println(rs.getString(1) + ": " + rs.getInt(2));
}
try { rs.close(); } catch ( Exception ex ) {}
try { pStmt.close(); } catch ( Exception ex ) {}
try { conn.close(); } catch ( Exception ex ) {}
conn = null;
}
}
我可以使用javac JamesGallagher.java
编译它并使用java JamesGallagher 1500
执行,并根据绑定值打印结果:
ALLEN: 1600
JONES: 2975
BLAKE: 2850
CLARK: 2450
SCOTT: 3000
KING: 5000
FORD: 3000