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;
错误讯息:
java.sql.SQLException:ORA-00905:缺少关键字ORA-06512:at " ROHIT.HELD1",第8行ORA-06512:第1行
答案 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 引擎之间存在上下文切换。