1

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

4

1 回答 1

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表的简单独立示例:

导入java.sql。; 导入 java.text。; 导入 oracle.jdbc.*;导入 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
于 2013-05-08T20:54:16.067 回答