Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PL/SQL中创建临时表_Sql_Oracle_Plsql_Oracle10g_Temp Tables - Fatal编程技术网

在PL/SQL中创建临时表

在PL/SQL中创建临时表,sql,oracle,plsql,oracle10g,temp-tables,Sql,Oracle,Plsql,Oracle10g,Temp Tables,我正在使用Oracle 10g数据库,我想从一个表中提取一组记录,然后用它从一组相关表中提取记录 如果这是T-SQL,我会这样做: CREATE TABLE #PatientIDs ( pId int ) INSERT INTO #PatientIDs select distinct pId from appointments SELECT * from Person WHERE Person.pId IN (select pId from #PatientIDs) SELECT

我正在使用Oracle 10g数据库,我想从一个表中提取一组记录,然后用它从一组相关表中提取记录

如果这是T-SQL,我会这样做:

CREATE TABLE #PatientIDs (
  pId int
)

INSERT INTO #PatientIDs
  select distinct pId from appointments

SELECT * from Person WHERE Person.pId IN (select pId from #PatientIDs)

SELECT * from Allergies WHERE Allergies.pId IN (select pId from #PatientIDs)

DROP TABLE #PatientIDs
然而,我看到的所有有用的页面使这看起来比它可能做的工作多得多,所以我想我一定错过了一些明显的东西


(顺便说一句,我可能不会将其作为一个脚本运行,而是在Oracle SQL Developer中打开一个会话,创建临时表,然后运行每个查询,并将其导出为CSV。这样行吗?

Oracle有临时表,但它们需要显式创建:

create global temporary table...
临时表中的数据对于创建临时表的会话是专用的,可以是特定于会话的数据,也可以是特定于事务的数据。如果在会话结束之前数据不被删除,则需要在create语句末尾对COMMIT PREVICE ROWS使用
。对它们也没有回滚或提交支持

在您给出的示例中,我认为没有必要使用临时表-由于临时表正在填充,因此对
约会
表所做的更新可能无法反映出来。在/存在/加入中使用:

SELECT p.* 
  FROM PERSON p
 WHERE EXISTS (SELECT NULL
                 FROM APPOINTMENTS a
                WHERE a.personid = a.id)

SELECT p.* 
  FROM PERSON p
 WHERE p.personid IN (SELECT a.id
                        FROM APPOINTMENTS a)

SELECT DISTINCT p.* 
  FROM PERSON p
  JOIN APPOINTMENTS a ON a.id = p.personid

如果有多个约会记录与一个人的记录相关联,则加入重复的风险,这就是我添加DISTINCT的原因。

当确切的问题已经解决时,如果您想在这方面积累一些有用的技能,我将看一看PL/SQL集合,特别是使用pl/SQL集合(大容量收集/大容量绑定)、RETURNING子句和使用%ROWTYPE定义集合的大容量SQL操作


通过了解以上所有内容,您可以显著减少编写的pl/sql代码量,但请始终记住,全sql解决方案几乎总是优于pl/sql解决方案。

Oracle没有像sql Server那样随意创建临时表的功能。必须在数据库模式中显式创建表(
createglobal tempory table
)。这还意味着您需要允许创建表的权限,并且脚本必须作为数据库更改显式部署。该表在全局名称空间中也可见

这是Oracle和SQL Server编程之间的一个显著的惯用差异。惯用的T-SQL可以广泛使用临时表,编写过程性T-SQL代码的真正需求非常少,这主要是因为这种工具

惯用的PL/SQL更容易跳转到过程代码中,这样做可能比伪造临时表更好。请注意,PL/SQL具有面向性能的结构,例如用于对游标和嵌套结果集(游标表达式)进行显式并行处理的流控制;最近的版本有一个JIT编译器


您可以使用一系列工具使过程性PL/SQL代码快速运行,这可以说是惯用的PL/SQL编程。底层的范例与T-SQL有些不同,临时表的方法是系统架构和编程习惯不同的一个要点。

为什么需要临时表步骤?您只是将一个选择替换为另一个选择。最初的选择是非常昂贵的吗?还是为了防止并发事务改变情况?Oracle不是SQL Server,我们需要使用临时表的情况实际上非常少见。请阅读我对这个类似问题的回答:我在简化——我实际上想做的是抓住最后100名患者(减去一点重复)。但下面的讨论提醒我,从今天早上午夜开始,我可以抓到100名患者,而不必担心系统日期会随着时间的推移而发生变化。:-)问题文本中没有关于日期限制的内容。您能用选择标准的详细信息更新问题吗?您可能想看看其他一些可用的非默认事务隔离级别。我相信serializable和read-only都会在事务开始时显示结果。事务启动后插入的行不会出现。这是我最初考虑的方式,但我正在筛选apptDateapptdate>=trunc(sysdate)-1和apptdDate