如何在 SQL Plus/SQL-PL 中使用迭代或作为函数运行查询?

Posted

技术标签:

【中文标题】如何在 SQL Plus/SQL-PL 中使用迭代或作为函数运行查询?【英文标题】:How can I run a query with iteration or as a function in SQL Plus/SQL-PL? 【发布时间】:2019-12-06 14:50:20 【问题描述】:

SQL Plus 的新手,对迭代和函数如何使用它有点困惑。希望有人可以告诉我如何使用以下脚本完成:

set embedded on
set echo off
set colsep ,
set pagesize 0
set linesize 1000
set numwidth 10
set headsep off
spool <my_file_path>.csv;
select * from (select /*csv*/ row_number() over (order by t.objectid) as id, t.objectid as transformer_id, t.gps_x as lon, t.gps_y as lat, s.electricmeternumber, s.serviceindex, s.accountnumber,
case 
     when t.phasedesignation = 0 then 'unknown'
     when t.phasedesignation = 1 then 'C'
     when t.phasedesignation = 2 then 'B'
     when t.phasedesignation = 3 then 'BC'
     when t.phasedesignation = 4 then 'A'
     when t.phasedesignation = 5 then 'AC'
     when t.phasedesignation = 6 then 'AB'
     when t.phasedesignation = 7 then 'ABC'
     end as phase_designation
from mvtransformer t, vservicepoint_meterinfo s 
where t.objectid = s.transformerobjectid) where id > some value x and id <= some value x;
spool off; 

所以我想做的是多次重复这个脚本,每次都改变 x 和文件路径。在 SQL Plus 中解决此问题的最佳方法是什么?

谢谢!

【问题讨论】:

【参考方案1】:

您可以声明一些替换变量,将查询放在自己的脚本中,然后在填充相关变量后多次调用该脚本。

例如类似:

脚本多次调用:

spool &&filename..csv;

SELECT *
FROM   (SELECT /*csv*/
               row_number() over(ORDER BY t.objectid) AS id,
               t.objectid AS transformer_id,
               t.gps_x AS lon,
               t.gps_y AS lat,
               s.electricmeternumber,
               s.serviceindex,
               s.accountnumber,
               CASE
                 WHEN t.phasedesignation = 0 THEN 'unknown'
                 WHEN t.phasedesignation = 1 THEN 'C'
                 WHEN t.phasedesignation = 2 THEN 'B'
                 WHEN t.phasedesignation = 3 THEN 'BC'
                 WHEN t.phasedesignation = 4 THEN 'A'
                 WHEN t.phasedesignation = 5 THEN 'AC'
                 WHEN t.phasedesignation = 6 THEN 'AB'
                 WHEN t.phasedesignation = 7 THEN 'ABC'
               END  AS phase_designation
              FROM   mvtransformer           t,
                     vservicepoint_meterinfo s
              WHERE  t.objectid = s.transformerobjectid)
WHERE  id > &&val1
AND    id <= &&val2;
spool off; 

调用脚本

set embedded on
set echo off
set colsep ,
set pagesize 0
set linesize 1000
set numwidth 10
set headsep off

define val1=10
define val2=20
define filename=your_filename1

@script_to_loop_over

define val1=30
define val2=40
define filename=your_filename2

@script_to_loop_over

...

注意. 用于指示 SQL*Plus 中替换变量名的结束。看起来您正在使用 SQL Developer/SQLCli,它可能会或可能不会将其视为与 SQL*Plus 相同。如果不是,您需要改用spool &amp;&amp;filename.csv

【讨论】:

以上是关于如何在 SQL Plus/SQL-PL 中使用迭代或作为函数运行查询?的主要内容,如果未能解决你的问题,请参考以下文章

SQL:使用 modify 函数迭代 xml 节点或如何递归地插入或修改节点

在脚本中迭代/循环 Spark parquet 文件会导致内存错误/堆积(使用 Spark SQL 查询)

如何有效地将巨大的 sql 表加载到 asp.net 应用程序内存中以进一步迭代它?

迭代SQL中的数据[关闭]

PL/SQL 迭代所有模式并在所有模式上运行相同的查询

如何修改 SQL 查询以迭代每 100 个结果,然后执行外部查询?