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

时间:2014-08-16 08:45:42

标签: oracle plsql oracle10g

我是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;

3 个答案:

答案 0 :(得分:2)

为了澄清,SQL是许多RDBMS所包含的语言,包括SQL Server,PostgreSQL等。如果您在Oracle中执行此操作,则 使用SQL。但是,大多数RDBMS还为SQL添加了一个过程扩展,如T-SQL(SQL Server),pgPL / SQL(PostgreSQL)和PL / SQL(Oracle)。在这种情况下,您尝试使用PL / SQL。

从您尝试做的事情开始,我假设您已经习惯了SQL Server和临时表。在Oracle中使用临时表是less common and less necessary

首先,EXECUTE IMMEDIATE 'TRUNCATE TABLE MYTABLE';。在Oracle中的存储过程中很少需要执行DDL;它通常表明数据模型存在缺陷。在这种情况下,您似乎将实际表用作临时表。我不会这样做。如果您需要临时表,请使用global temporary table

其次,SELECT * FROM MYTABLE。你不能在PL / SQL中这样做。如果您需要选择一些数据,则必须使用SELECT <columns> INTO <variables> FROM ...。如果你这样做,它就不会告诉你表格的内容。

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

SELECT COL1, COL2, COL3 FROM MYOTHERTABLE;

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

答案 1 :(得分:0)

我怀疑你打算在编译和执行程序后执行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
/

分享并享受。

答案 2 :(得分:0)

我的DBA不会让我拥有TRUNCATE权限,即使截断与delete MYTABLE;相比删除了高水位标记。如果没有这些权限,您的代码将失败。 @Ben和@Bob Jarvis都提供了缺少INTO和更好形式的合理建议。鲍勃贾维斯的一个补充&#39;答案是你需要用SET SERVEROUTPUT ON SIZE 100000;启动命令。否则,将不会显示他精心设计的错误消息。 serveroutput命令用于DBMS_OUTPUT,只有在数据库会话持续时才会持续。