从匿名块返回游标结果

时间:2013-05-08 13:30:39

标签: sql oracle select plsql cursor

我有以下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一样?

1 个答案:

答案 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