Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL与蟾蜍_Sql_Plsql_Toad - Fatal编程技术网

SQL与蟾蜍

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查询,它根据用户输入获取一些值,例如:-

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