SQL与蟾蜍
我有一个select查询,它根据用户输入获取一些值,例如:-SQL与蟾蜍,sql,plsql,toad,Sql,Plsql,Toad,我有一个select查询,它根据用户输入获取一些值,例如:- SELECT company, accounts from testdrive WHERE company LIKE '&Company', accounts = '&Account' order by company desc 在Toad中运行此命令时,系统会提示用户输入值。。但是我想知道用户如何指定条件和值??Detno>,他不能。为此,您需要动态sql。没有直接的方法 对于简单的情况,您可以通过为不
SELECT
company, accounts
from testdrive
WHERE company LIKE '&Company', accounts = '&Account'
order by company desc
在Toad中运行此命令时,系统会提示用户输入值。。但是我想知道用户如何指定条件和值??Detno>,他不能。为此,您需要动态sql。没有直接的方法 对于简单的情况,您可以通过为不同的比较提供多个参数来克服此限制 例如 然后您可以同时提供datesmaller和datesmallerequal。只需将不需要的设置为将来某个日期,条件将不会起任何作用
但这只适用于简单的情况,一般来说,您需要动态SQL,或者可以在内部处理复杂参数的存储过程。我不是TOAD用户,但看起来TOAD只是依赖SQLPlus的替换变量功能。SQLPlus替换变量不是绑定变量——它们只是哑字符串替换——所以您可以在其中放入任何您想要的内容。在这种情况下,你看到过如果你这样做会发生什么吗:
SELECT company
, accounts
FROM testdrive
WHERE company &Company_Comparison '&Company'
AND accounts &Account_Comparison '&Account'
ORDER BY company DESC;
应提示用户进行公司比较和账户比较,用户可在此处输入!=,例如,等等。当然,您将无法验证他们的输入,类似的情况很容易受到SQL注入攻击,但由于您的客户机是蟾蜍,我认为您并不是真正在寻找防弹解决方案。为每个列编写一个函数,该列接受一个运算符作为参数。这样,可以通过绑定变量以及操作数本身提供运算符。然而,这种方法可能会遇到性能问题,因为优化器根本无法很好地计算谓词的选择性 e、 g
但是要注意性能问题——除非你能以正常的方式指定一些其他谓词,否则你只能看到完整的扫描 这可能是一种方法。在SQL*PLus中,您当然可以通过&substitution变量提供语句的任何部分,我很确定TOAD也会这样做。
SELECT company
, accounts
FROM testdrive
WHERE company &Company_Comparison '&Company'
AND accounts &Account_Comparison '&Account'
ORDER BY company DESC;
FUNCTION company_is (company IN VARCHAR2, op IN VARCHAR2, value IN VARCHAR2) IS
BEGIN
RETURN CASE op
WHEN '=' THEN (company = value)
WHEN 'LIKE' THEN (company LIKE value)
WHEN '<' THEN (company < value)
...
END;
END;
FUNCTION date_is (thedate IN DATE, op IN VARCHAR2, value IN DATE) IS
BEGIN
RETURN CASE op
WHEN '=' THEN (thedate = value)
WHEN '<' THEN (thedate < value)
...
END;
END;
SELECT company, accounts
FROM testdrive AS t
WHERE company_is(t.company,'&CompanyOp','&Company')
AND date_is(t.date_created,'&CreatedOp',TO_DATE('&Created','DD/MM/YYYY'))
ORDER BY company DESC