Oracle 在存储过程中组合多个语句

Oracle 在存储过程中组合多个语句,oracle,plsql,oracle10g,Oracle,Plsql,Oracle10g,我是Oracle的新手,我试图在SQL中实现的目标是可以实现的,但在Oracle中实现这一目标却遇到了困难 因此,在存储过程中,我尝试截断一个表,然后插入值,最后对该表运行SELECT语句 这是我所拥有的,但它不起作用,当我运行这个脚本时,它运行时没有错误,但它似乎只通过第一个(TRUNCATE)语句,就这样 我希望它创建存储过程(确实如此),然后从SELECT语句中显示表的内容 CREATE OR REPLACE procedure MYSTOREDPROCEDURE is BEGIN EXE

我是Oracle的新手,我试图在SQL中实现的目标是可以实现的,但在Oracle中实现这一目标却遇到了困难

因此,在存储过程中,我尝试截断一个表,然后插入值,最后对该表运行SELECT语句

这是我所拥有的,但它不起作用,当我运行这个脚本时,它运行时没有错误,但它似乎只通过第一个(TRUNCATE)语句,就这样

我希望它创建存储过程(确实如此),然后从SELECT语句中显示表的内容

CREATE OR REPLACE procedure MYSTOREDPROCEDURE is
BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE MYTABLE';
INSERT INTO MYTABLE
(COL1,
COL2,
COL3)

SELECT COL1, COL2, COL3 FROM MYOTHERTABLE;
end ;
/

SELECT * FROM MYTABLE

END MYSTOREDPROCEDURE;

为了澄清,SQL是一种由许多RDBMS(包括SQL Server、PostgreSQL等)实现的语言。如果您在Oracle中这样做,那么您就是在使用SQL。然而,大多数RDBMS还向SQL添加了过程扩展,如T-SQL(SQL Server)、pgPL/SQL(PostgreSQL)和PL/SQL(Oracle)。在本例中,您正在尝试使用PL/SQL

从您试图做的事情来看,我假设您已经习惯了SQL Server和临时表。这是为了在Oracle中使用临时表

首先,
执行立即的“TRUNCATE TABLE MYTABLE”。在Oracle中,很少需要在存储过程中执行DDL;这通常表示数据模型中存在缺陷。在本例中,似乎您正在使用实际表作为临时表。我不会这么做的。如果您需要一个临时表,请使用

其次,
从MYTABLE中选择*。在PL/SQL中不能这样做。如果您需要选择某些数据,则必须使用
选择进入…
。如果这样做,它将不会显示表的内容

根据您对尝试内容的描述,您只需执行以下操作:

SELECT COL1, COL2, COL3 FROM MYOTHERTABLE;

根本不需要PL/SQL(存储过程)。

我怀疑您打算在编译和执行过程后执行
SELECT*FROM MYTABLE
。可将上述内容重新压缩为:

CREATE OR REPLACE procedure MYSTOREDPROCEDURE is
BEGIN
  EXECUTE IMMEDIATE 'TRUNCATE TABLE MYTABLE';

  INSERT INTO MYTABLE (COL1, COL2, COL3)
    SELECT COL1, COL2, COL3
      FROM MYOTHERTABLE;

EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('Error in MYSTOREDPROCEDURE : ' || SQLCODE || ' - ' || SQLERRM);
    RAISE;
END MYSTOREDPROCEDURE;
/

EXECUTE MYSTOREDPROCEDURE
/

SELECT * FROM MYTABLE
/

分享和享受。

我的DBA不会让我拥有
TRUNCATE
特权,即使TRUNCATE与
delete MYTABLE相比删除了高水位如果没有这些权限,您的代码将失败。无论是@Ben还是@Bob Jarvis,他们都能以更好的形式提供正确的建议。Bob Jarvis的答案的另一个补充是,您需要在启动命令时使用
将SERVEROUTPUT设置为大小100000。否则,他精心编制的错误消息将不会显示。
serveroutput
命令用于
DBMS\u输出
,只持续数据库会话的时间。

Hi Ben,我简化了我的帖子,说我正在从MyTherTable获取数据并将其插入MYTABLE,实际上我必须连接多个表,然后将数据插入MYTABLE。然后,这个存储过程将在RDL报告中使用,这就是为什么我在最后考虑使用SELECT*FROM MYTABLE。您首先要截断表。如果数据不需要持久化,那么使用临时表就没有意义了。