我试图在java中放入一些反sql注入,并且发现很难使用"replaceAll"字符串函数.最后,我需要将任何现有的转换功能\来\\,任何"到\",任何'到\',任何\n以\\n使得当字符串由MySQL的SQL注入评估将被阻止.
我已经搞砸了一些我正在使用的代码,所有\\\\\\\\\\\功能都让我的眼睛变得疯狂.如果有人碰巧有这样的例子我会非常感激.
CREATE OR REPLACE TYPE ty_1 AS OBJECT ( fn VARCHAR2(100),
sl NUMBER,
hd DATE );
CREATE OR REPLACE TYPE ty_1_table AS TABLE OF ty_1;
CREATE OR REPLACE FUNCTION FN_RET_COL
RETURN ty_1_table
AS
c ty_1_table := TY_1_TABLE();
BEGIN
c.extend;
C(1) := TY_1('A', 1, '10-JUN-2013');
c.extend;
C(2) := TY_1('B', 2, '11-JUN-2013');
c.extend;
C(3) := TY_1('C', 3, '12-JUN-2013');
RETURN c;
END;
CREATE OR REPLACE FUNCTION FN_RET_PIPE RETURN ty_1_table PIPELINED IS
BEGIN
PIPE ROW (TY_1('A', 1, '10-JUN-2013'));
PIPE ROW (TY_1('B', 2, '11-JUN-2013'));
PIPE ROW …Run Code Online (Sandbox Code Playgroud) 我有一个SELECT查询,其中我将有一个动态WHERE条件。问题是当我尝试将WHERE条件PARAMETER与 SQL 查询连接起来时,它不允许我保存PROCEDURE.
例如:
CREATE PROCEDURE usp_MySearchQuery
(
QTYPE IN INT,
OUT_CUR OUT SYS_REFCURSOR
)
IS
DYN_QUERY VARCHAR2;
BEGIN
IF QTYPE=1 THEN
DYN_QUERY :=' BETWEEN 1 AND 2';
ELSE
DYN_QUERY :='=10';
END IF;
OPEN OUT_CUR FOR
SELECT * FROM MYTABLE WHERE TYPE=QTYPE AND ID || DYN_QUERY;
END;
Run Code Online (Sandbox Code Playgroud)
这就是我的程序的样子。我试过了,EXECUTE IMMEDIETE但在它的文档中,它写成它不适用于多行查询。
在MSSQL我们有EXEC(不确定)可以execute将文本发送到命令的命令。以同样的方式,我们是否有任何可以运行动态查询的命令Oracle
UPDATE: Answer
Run Code Online (Sandbox Code Playgroud)
我是这样试的。
OPEN OUT_CUR FOR
' SELECT * FROM MYTABLE …Run Code Online (Sandbox Code Playgroud) 我搜索了一些如何使用立即执行从 select 语句返回值的示例,但它不断返回错误“ORA-00903:无效的表名”。
这是代码示例:
DECLARE
LAST_NUMBER NUMBER;
CURSOR C_SEQUENCES IS
SELECT
A.SEQUENCE_NAME, B.TABLE_NAME, C.COLUMN_NAME
FROM
USER_SEQUENCES A
INNER JOIN
USER_CONSTRAINTS B ON A.SEQUENCE_NAME = REPLACE(B.CONSTRAINT_NAME, 'PK', 'SEQ_ID')
INNER JOIN
USER_CONS_COLUMNS C ON B.CONSTRAINT_NAME = C.CONSTRAINT_NAME
WHERE
B.CONSTRAINT_TYPE = 'P';
BEGIN
FOR REG IN C_SEQUENCES LOOP
EXECUTE IMMEDIATE 'SELECT MAX(:1) FROM :2' INTO LAST_NUMBER USING REG.COLUMN_NAME, REG.TABLE_NAME;
END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)
是的,该表确实存在。
有任何想法吗?