繁体   English   中英

将PL / SQL发送到Oracle而不创建存储过程

[英]Send PL/SQL to Oracle without creating a stored procedure

我是PL / SQL Oracle的新手。 我曾经使用过JDBC框架和标准SQL。

例如,下一个PL / SQL:

IF EXISTS (SELECT * FROM Table1 WHERE Column1=’SomeValue’)
    UPDATE Table1 SET (…) WHERE Column1=’SomeValue’
ELSE
    INSERT INTO Table1 VALUES (…)

这句话必须从oracle中的存储过程中执行,因此您必须在数据库中创建一个过程并调用它,但是为什么我不能像“ select”语句那样将该句子发送到数据库并执行而不必创建首先是存储过程?

您可以使用可调用语句执行匿名PL / SQL块。 您将要使用预处理语句,因为它可以提高Oracle的性能并防止SQL注入。

PL / SQL块与BEGIN和END嵌套在一起,或者如果您具有局部变量,则与DECLARE / BEGIN / END嵌套在一起。

String plsqlBlock =
    "begin " +
    "  update Table1 " +
    "    set val1 = :v1, val2 = :v2 " +
    "    where primary_key = :pk; " +
    "  if sql%rowcount = 0 then " +
    "    insert into Table1 (primary_key, val1, val2) " +
    "      values (:pk, :v1, :v2); " +
    "  end if; " +
    "end;";

CallableStatement cs = connection.prepareCall(plsqlBlock);
cs.setInt("pk", 12345);
cs.setString("v1", "abc");
cs.setString("v2", "def");
cs.execute();

实际上,允许您使用客户端直接对数据库执行PL / SQL,并将代码嵌入“ begin ... end ”结构中。

例如,使用sqlplus如下所示(永远不要忘记以/ -最后一行/第一个字符结尾的plsql语句):

begin
  IF EXISTS (SELECT * FROM Table1 WHERE Column1=’SomeValue’) 
  THEN
    UPDATE Table1 SET (…) WHERE Column1=’SomeValue’
    ;
  ELSE
    INSERT INTO Table1 VALUES (…) 
    ;
  END IF;
end;
/

(我为您的if / else结构添加了正确的语法)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM