【问题标题】:Subqueries with Define带有定义的子查询
【发布时间】:2021-06-20 08:40:03
【问题描述】:

带有define的子查询

你好,

我有一个关于在真实单词中使用 DEFINE 的问题。

我刚刚修改了讲座中的代码,在开始时定义了我们正在使用的员工,然后在代码中使用该定义的变量,如下所示:

DEFINE employee = "(select * from employees where employee_id = 145)";
 
-- all employees that work in the same departmant as 'defined employee'
SELECT *
FROM   employees
WHERE  department_id = (
                        SELECT department_id 
                        FROM   &employee        -- here using that variable
                        );

这个解决方案聪明吗?你真的会这样做吗?

我的意思是,如果我们将与同一个人进行大量查询,那么稍后我们不必更改每个查询,因为我们将不得不更改 employee_id ,我们只需更改定义变量中的 id ,一切都会继续工作。

或者我是否应该定义更多变量,例如:

定义薪水 = ...

定义部门 = ...

为了内存优化,所以我们不会返回所有员工的信息,而只返回我们真正需要的信息?

问候

【问题讨论】:

  • 你打算如何使用这个脚本?例如这是批处理作业的一部分吗?
  • "这是你在现实世界中会做的事情吗?"不,这不是我会做的事情。如果您想存储变量以在查询之间重复使用,请使用 PL/SQL。

标签: sql oracle query-optimization database-performance sqlperformance


【解决方案1】:

好主意,但不是最好的实施方式。谷歌搜索“SQL 注入”是一个原因。

更好:为您“定义”的select 语句使用视图,并在需要时引用该视图。并使用绑定变量(Google 找到教你如何使用绑定变量的链接)来处理员工 ID 或部门等内容。这样可以防止 SQL 注入,而且效率更高因为每次输入更改时都不需要重新编译查询(这将在您的方法中发生)。

【讨论】:

  • 我看到有人对我的回答投了反对票。对他们发现的错误进行解释会有所帮助。没有它,它看起来更像是故意破坏。
【解决方案2】:

DEFINE 是一个简单替换的 SQL*Plus 命令。它与 SQL 语言无关。它不能用于通过例如 ODBC 或 JDBC 进行的查询,因此它的实际使用受限于您自己工作的自动化,当您可能有一堆您最喜欢的准备好的脚本并希望对它们进行参数化以获得灵活性时。

如果您通过 SQL*Plus 进行连接,那么您已经拥有数据库凭据并且已经可以在数据库中执行很多操作,因此这不适用于最终用户。

这是关于此主题的精彩文章:SQL*Plus Substitution Variables - DEFINE variables and parameters in SQL Queries

要使用用户输入,您需要绑定变量:它们接受数据,而不是一些和平的文本,并且从不与关键字、标识符、函数等 SQL 标记混合。

因此,结论是:如果您对自己的日常任务感到满意,那可能没问题。但不向用户发布。

【讨论】:

    猜你喜欢
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 2022-10-14
    相关资源
    最近更新 更多