将参数输入和输出到匿名pl / sql

时间:2014-12-23 01:54:33

标签: binding plsql oracle11g anonymous

如果Oracle允许,我似乎无法找到问题。我有一个匿名的PL / SQL块,打算做

  1. 使用一些WHERE子句进行SELECT,其中值不是固定的,而是在运行时确定的
  2. 然后从一组返回的行中选择一个匹配并更新它的行。
  3. 最后的目的是将UPDATED行列传递回应用程序
  4. 我不完全确定如何

    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块执行后发回。

2 个答案:

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