【问题标题】:Sorting an Oracle table inside a stored procedure在存储过程中对 Oracle 表进行排序
【发布时间】:2013-08-12 20:20:16
【问题描述】:

我有一个从 .sql 文件运行的存储过程,该文件接受用户的输入并运行该过程。该过程运行许多查询并将一行值插入到表中。在 .sql 文件中,我想在完成运行查询后按某个列对表进行排序。目前我有:

DECLARE
 NAMEPARAM VARCHAR2(200);
 VERSIONPARAM VARCHAR2(200);
 STARTDATE DATE;
 ENDDATE DATE;

BEGIN
 NAMEPARAM := '&1';
 VERSIONPARAM := '&2';
 STARTDATE := '&3';
 ENDDATE := '&4';

 PROCEDURE(NAMEPARAM, VERSIONPARAM, STARTDATE, ENDDATE);
 COMMIT;

 Select * from TABLE_NAME
 ORDER BY COLUMN_NAME ASC;

 EXCEPTION
 WHEN OTHERS THEN
 RAISE_APPLICATION_ERROR(-20101,SQLERRM);
 END;
 /

但是它会抛出错误:

PLS-00428:此 SELECT 语句中应有一个 INTO 子句

我不知道为什么它需要一个 into 子句。帮忙?

编辑: 澄清一下,我不想看到已排序表的输出,我希望表本身能够更新并按列按升序排序。

【问题讨论】:

  • “排序 Oracle 表”是什么意思?表是无序的行集。他们没有订单。查询结果可以排序,由order by子句决定。
  • @javakid1993,我怀疑您在误解 Oracle 表中的行具有内在顺序。哪有这回事。行仅在查询时排序。
  • 好吧,我的意思是即使在插入要按顺序插入的行时也要有一个子句。但我理解我来自哪里的错误。谢谢。

标签: sql oracle stored-procedures sqlplus


【解决方案1】:

如果您将SELECT 语句放在 PL/SQL 块中,则需要对结果进行一些处理。如果您期望恰好是一行,则可以使用 SELECT INTO 局部变量。假设您需要多行,您可以编写一个循环遍历行的FOR 循环,或者您可以将行BULK COLLECT 放入一个PL/SQL 集合中。您也可以打开一个SYS_REFCURSOR,但由于无法从匿名 PL/SQL 块返回它,这似乎不太可能是您想要的。

我的猜测是您希望SELECT 语句位于 PL/SQL 块之外,并且您希望使用任何工具来执行 .sql 脚本来运行 PL/SQL 块以填充表然后运行SELECT 语句,将结果写入您正在假脱机输出的任何文件/控制台。

【讨论】:

  • 我不希望它输出到我希望表格本身按该列更新和排序的任何地方。我什至都不想看到输出。
  • @javakid1993,你读过其他的 cmets 吗?通常,数据库文件中的表行没有“排序”。可以对查询的结果进行排序。有索引组织表,与标准的堆管理表不同,但我怀疑这就是您要问的。
  • 正如 Gordon 和 OldProgrammer 所指出的 - 为什么要对表格进行“排序”而不想要任何排序的输出?如果您能清楚地考虑最终结果并制定解决方案,这将有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
相关资源
最近更新 更多