减少oracle PL/SQL语句

Posted

技术标签:

【中文标题】减少oracle PL/SQL语句【英文标题】:Reduce the oracle PL/SQL statement 【发布时间】:2020-02-14 14:46:54 【问题描述】:

我是 PL/SQL 的新手。经过几个小时的学习,我有一些 我有几个好奇的问题。示例我有一个这样的 SQL 语句:

SELECT ShipperName, OrderID, NumberOfOrders, ... 
FROM Orders

我们可以声明一个变量来保存“列表选择”,比如list_select = 'ShipperName, OrderID, NumberOfOrders, ... ' 然后用我们声明的“list select”替换select语句?

SELECT list_select 
FROM Orders

还有其他问题,我们可以减少像 Image 这样的 SQL 语句吗?我在 Oracle SQL Developer 中尝试过,编译器没问题,但是当我运行测试时,“按段”出现错误。

感谢任何帮助并感谢您的帮助。

【问题讨论】:

不要将代码发布为图片。请参阅此处了解更多详细信息原因:meta.***.com/questions/285551 请一次提出一个问题。这应该是两个请求:第一个关于动态 SQL(可以使用 PL/SQL 解决,如 Ankit Bajpai 的回答所示)。第二个关于如何优化 SQL 中的查询(如我的回答中所回答)。 如果您有两个问题,请分别提出 两个问题。 *** 上的一个线程应该包含一个问题和(理想情况下)一个接受的答案。该线程有两个单独的答案,一个针对您发布的每个问题。你不能同时接受它们。 【参考方案1】:

对于您的第一个问题,您可以搜索用于动态查询执行的“EXECUTE IMMEDIATE”语句。所以你可以试试下面的 -

EXECUTE IMMEDIATE 'SELECT ' || YOUR_COMMA_DELIMITED_COLUMNS_LIST || ' FROM Orders';

对于第二个,请发布示例数据和预期结果。

【讨论】:

【参考方案2】:

对于您的第二个问题:您不想在这里加入,因为您只从 table1 中选择。你宁愿想要[NOT] EXISTS[NOT] IN。例如:

SELECT orderid, clientid
FROM orders o
WHERE EXISTS -- We are looking for orders containing expensive items
(
  SELECT null 
  FROM orderposition op
  WHERE op.orderid = o.orderid
  AND op.price > 1000
)
AND -- and the client ...
(
  NOT EXISTS -- ... must have paid all their invoices (there exists no unpaid invoice)
  (
    SELECT null 
    FROM invoices i
    WHERE i.clientid = o.clientid
    AND i.paid_date IS NULL
  )
  OR clientid IN -- ... or be known as reliable client (they are in the set of reliable ones)
  (
    SELECT c.clientid
    FROM clients c
    WHERE c.reliable = 'YES'
  )
);

【讨论】:

以上是关于减少oracle PL/SQL语句的主要内容,如果未能解决你的问题,请参考以下文章

oracle数据库之PL/SQL 流程控制语句

PL/SQL语法简介(匿名PL/SQL块)

oracle PL/SQL语句题目求教!

oracle SQL语句中怎么样调用存储过程

Oracle PL/SQL语句基础学习笔记(上)

SQL Plus 无法识别 Oracle PL/SQL 语句