如果Oracle允许,我似乎无法找到问题。我有一个匿名的PL / SQL块,打算做
我不完全确定如何
a_将参数/绑定变量传递到" 匿名 PL / SQL块中 b_从匿名 PL / SQL块中获取一行甚至是一个id(上面的步骤3)。
虽然我知道可以对命名的存储过程或函数执行操作 - 如果a和b可能用于匿名 pl / sql,我会得到不明确的响应。
以下是代表性代码:
DECLARE
n1 NUMBER ;
n2 NUMBER ;
rid UROWID;
CURSOR c IS SELECT rowid from MY_TABLE WHERE colA= n1;
row MY_TABLE%ROWTYPE;
BEGIN
OPEN c;
FETCH c INTO rid;
LOOP
SELECT * INTO row FROM MY_TABLE where rowid=rid FOR UPDATE;
IF SQL%NOTFOUND THEN
CONTINUE;
ELSE
UPDATE MY_TABLE SET colZ= n2 WHERE rowid = rid;
IF SQL%ROWCOUNT = 1 THEN
// need to return value of row back to application
END IF;
END IF;
END LOOP;
END;
这是我要找的东西(特别是对于匿名的pl / sql) - 我正在寻找n1和n2被调用应用程序设置为绑定变量或输入参数。 - 此外,我正在查看更新的行是否可以在pl / sql块执行后发回。
答案 0 :(得分:2)
非常感谢@ user272735暗示绑定变量。我进一步探索了一下,发现我可以使用callable语句,它也会输入输入和输出的位置参数。
所以,上面的plsql会变成(在java代码中)。
//see how to use multiline literals in java; kept here without quotes for clarity
// note n1 and n2 are commented as they can be bound as in parameters in the host env.
// also note that input and output parameters are replaced by ?
String sql = "DECLARE
-- n1 NUMBER ;
-- n2 NUMBER ;
rid UROWID;
CURSOR c IS SELECT rowid from MY_TABLE WHERE colA= ?;
row MY_TABLE%ROWTYPE;
BEGIN
OPEN c;
FETCH c INTO rid;
LOOP
SELECT * INTO row FROM MY_TABLE where rowid=rid FOR UPDATE;
IF SQL%NOTFOUND THEN
CONTINUE;
ELSE
UPDATE MY_TABLE SET colZ= ? WHERE rowid = rid;
IF SQL%ROWCOUNT = 1 THEN
SELECT colP INTO ? from MY_TABLE where rowid = rid;
END IF;
END IF;
END LOOP;
END;";
CallableStatement cst = conn.prepareCall(sql);
cst.setBigDecimal(1,new BigDecimal(n1)); //this is the first input parameter
cst.setBigDecimal(2,new BigDecimal(n2)); // this is the second input parameter
cst.registerOutParameter(3,0); // this is the third parameter to be used for output
cst.executeUpdate();
String s = cst.getString(3); // for the third parameter which is also the out parameter
答案 1 :(得分:0)
您可以使用绑定变量作为匿名块的输入。 但是没有办法从匿名块中返回任何值。
即使你有一个RETURN语句,也可以在块中使用。此语句仅用于退出块,而不是将任何值作为输出发送。
http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/subprograms.htm#LNPLS99896