【问题标题】:Oracle temporary storage甲骨文临时存储
【发布时间】:2014-06-10 23:14:15
【问题描述】:

我需要执行一个一次性脚本(即它不会部署在活系统中)来更正现有表中的某些值。

脚本本身不相关。这里的问题是“一些值”部分:要调整的数据(键和旧值和新值)是在电子表格中收集的。假设它有很多行,比如 4 或 5 列。

在 MSSQL Server 术语中,我将创建一个临时表来保存输入值,并在将电子表格导出为 CSV 后将它们全部输入(加上一些文本转换,可能使用 sed(1) 或 paste(1) unix shell 命令):

CREATE TABLE #inputdata (col1 AS INTEGER, col2 AS VARCHAR ...);

INSERT INTO #inputdata VALUES (...);
...
INSERT INTO #inputdata VALUES (...);

-- then comes the script which can SELECT FROM #inputdata
-- just like a normal table

我需要在 Oracle 中执行此操作。

Oracle 临时表似乎只是数据方面的临时表,我的意思是,它们在使用之前应该已经存在于数据库中。我没有,也永远不会拥有创建它的必要权限; SQLServer 允许创建临时表而不管普通的表创建权限。

有什么想法吗?

【问题讨论】:

  • 你有什么特权?如果您没有创建对象的权限,那么使用临时表或外部表都会被淘汰。如果您无法获得在任何模式中创建任何类型对象的权限,您可能会使用 PL/SQL 集合,但是您需要做一些工作来根据文件中的数据初始化集合。
  • 在 oracle 中,你有你的表类型的数组,等等。在 pl/sql 中有很多方法来存储临时数据。如果您对架构具有创建权限,则可以执行 create table xxx as select ....ss64.com/oraplsql/declaretbl.html
  • 我拥有的唯一权限是 INSERT/SELECT/UPDATE/DELETE。没有别的了。

标签: sql-server oracle temporary-objects


【解决方案1】:

我已经解决了 WITH 子句的问题:

WITH inputdata AS (
    SELECT  ... AS col1, ... AS col2, ... FROM DUAL UNION ALL
    SELECT  ... AS col1, ... AS col2, ... FROM DUAL UNION ALL
    ...
    SELECT  ... AS col1, ... AS col2, ... FROM DUAL UNION ALL
    SELECT  ... AS col1, ... AS col2, ... FROM DUAL
)
SELECT ...
FROM .... INNER JOIN inputdata ON ...
WHERE inputdata...

在我的脚本中,只涉及 SELECT 和 INSERT。

对于 INSERT,语法变为:

INSERT INTO tableX (...)
WITH inputdata AS (
    SELECT  ... AS col1, ... AS col2, ... FROM DUAL UNION ALL
    SELECT  ... AS col1, ... AS col2, ... FROM DUAL UNION ALL
    ...
    SELECT  ... AS col1, ... AS col2, ... FROM DUAL UNION ALL
    SELECT  ... AS col1, ... AS col2, ... FROM DUAL
)
SELECT ...
FROM .... INNER JOIN inputdata ON ...
WHERE inputdata...

【讨论】:

  • 在我看来,这是一个可怕的解决方案,但确实有效。不知道 WITH 子句是否适用于 UPDATE 或 DELETE(对于 DELETE,我认为子查询可以解决所有情况;对于 UPDATE,当要更新的值来自输入表时,我想不出解决方案)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-10
  • 2010-10-05
相关资源
最近更新 更多