在oracle databsase中传递表名列名和列的值

时间:2015-07-28 06:15:10

标签: oracle plsql

jsp页面中的代码

 CallableStatement cs ;
cs=conn.prepareCall("{call held1(?,?,?)}"); 
cs.setString(1,"'"+session.getAttribute("roll")+"'"); // sending session to procedure .reciving this in s variable
cs.setString(2, "1");// sending serial nos as string and wanna recieve in sno. variable
cs.setString(3, "Monday"); // sending table name as string and wanna recieve it in tab variable
cs.executeUpdate();

"'&#34 + session.getAttribute("辊&#34)+"'"想在s参数中重现这个值 " 1"

oracle数据库中的代码

程序

create or replace procedure "HELD1"
(s  VARCHAR2,sno  VARCHAR2,tab  VARCHAR2)
is
l_col_name varchar2(30);
begin
execute immediate
'SELECT SUBJECTCODE into l_col_name FROM '||tab||' WHERE SERIALNUMBER ='''||sno||'''';

    execute immediate 
    'UPDATE dprofile SET '|| l_col_name || ' = ' || l_col_name || ' + 1 WHERE       Rollno = ''' ||s || '''';
end;
  • s:RollNo的值
  • sno:序列号作为参数传递String
  • tab:作为过程参数传递的表的名称

错误讯息:

  

java.sql.SQLException:ORA-00905:缺少关键字ORA-06512:at   " ROHIT.HELD1",第8行ORA-06512:第1行

2 个答案:

答案 0 :(得分:1)

动态 SQL执行的SELECT INTO ..部分如下所示。

execute immediate
'SELECT SUBJECTCODE  FROM '||tab||' WHERE SERIALNUMBER ='''||sno||''''
into l_col_name;

查询执行对SQL Engine是动态的......但数据仍然会返回到PL / SQL引擎。因此,提取部分仅在SQL执行后发生。

您很容易SQL*Injection。 Atleast使用where子句的绑定变量。

execute immediate
    'SELECT SUBJECTCODE  FROM '||tab||' WHERE SERIALNUMBER = :sno'
    into l_col_name
    using sno;

execute immediate 
'UPDATE dprofile '||
   ' SET '|| l_col_name || ' = ' || l_col_name || ' + 1 '||
   ' WHERE  Rollno = :s'
using s;

最后,在你的jdbc部分。

cs.setString(1,session.getAttribute("roll")); 

答案 1 :(得分:0)

  

立即执行   'SELECT SUBJECTCODE into l_col_name FROM'|| tab ||'在哪里SERIALNUMBER ='''|| sno ||'''';

INTO 子句应该在动态sql之后。

EXECUTE IMMEDIATE <dynamic sql> INTO variable;

不要与SELECT .. INTO混淆。你正在处理动态sql。首先执行查询,然后将返回的值分配给相应的变量。 PL / SQL SQL 引擎之间存在上下文切换。