2012-04-20 115 views
-1

我還沒有用oracle編寫很多存儲過程。我閱讀了一些tutotorials(例如:http://plsql-tutorial.com/plsql-procedures.htm),並試圖在我看到後對我的sp進行建模,但我仍遇到錯誤。這裏是一個小樣本程序,錯誤:編寫Oracle存儲過程

create or replace 
PROCEDURE TEST_SP() 
    BEGIN 

insert into tablespace.tablename 
select * from testtable; 

END TEST_SP; 

PLS-00103: Encountered the symbol ")" when expecting one of the following: 

    <an identifier> <a double-quoted delimited-identifier> 

,我感到我很想念聲明部分的印象,但我不明白,我應該要述說: -/

任何幫助將不勝感激。


隨後從第一反應Justin的意見,現在得到不同的錯誤:

create or replace 
PROCEDURE TEST_SP 
AS 
    BEGIN 

insert into tablespace.tablename (col1, col2) 
select (col1, col2) from testtable; 

END TEST_SP; 

PLS-00103: Encountered the symbol "AS" when expecting one of the following: 
. , @ in <an identifier> <a double-quoted delimited-identifier> partition subpartition 
+2

?你可以嘗試使用SQL * Plus來確保你的工具沒有問題(尤其是在可能存在未終止的SQL語句的GUI應用程序中)?如果你實際上在你的'INSERT'中使用了表空間的名稱而不是模式的名字,你會得到一個ORA-00942錯誤。一般來說,儘管您發佈的語法是有效的,但您不會在「SELECT」列中使用括號。 – 2012-04-20 18:30:53

+0

你說得對,我正在使用模式名稱而不是表空間。我正在使用sqldeveloper。 – 2012-04-20 22:13:03

+0

您確定沒有另一個SQL語句位於CREATE OR REPLACE PROCEDURE語句之上,但沒有正確結束嗎?你可以在SQL * Plus中運行CREATE OR REPLACE PROCEDURE語句嗎? – 2012-04-20 22:14:25

回答

4

這聽起來像你這樣的事情後。如果您沒有聲明任何參數,則不希望在過程的名稱後加括號。即使您不打算聲明任何本地變量,也需要在BEGIN之前使用關鍵字AS(或IS)。

create or replace PROCEDURE TEST_SP 
AS 
BEGIN 
    insert into tablespace.tablename 
    select * from testtable; 
END TEST_SP; 

但是,通常情況下,編寫這樣的代碼會省略列的列表。這假定這兩個表具有完全相同的順序定義完全相同的列,所以如果有人決定添加另一列到其中一個表,您的代碼將會中斷。它也會造成您無意中從錯誤列中複製數據的可能性。它通常是更強大的寫類似

create or replace PROCEDURE TEST_SP 
AS 
BEGIN 
    insert into tablespace.tablename(<<list of columns>>) 
    select <<list of columns>> 
     from testtable; 
END TEST_SP; 

當您正在使用什麼工具爲例

SQL> create table foo(col1 number); 

Table created. 

SQL> create table foo_cpy(col1 number); 

Table created. 

SQL> ed 
Wrote file afiedt.buf 

    1 create or replace procedure test_sp 
    2 as 
    3 begin 
    4 insert into foo(col1) 
    5  select col1 
    6  from foo_cpy; 
    7* end test_sp; 
SQL>/

Procedure created. 
+2

+1「爲了省略列表」 – 2012-04-20 17:33:04

+0

謝謝,賈斯汀。你對列名稱是正確的;我只是想要一個快速的方式來展示我的問題,同時保留主要點(存儲過程錯誤)而不會泄露任何實際數據。 感謝您的建議。我試過了,但現在得到了:「PLS-00103:遇到下列其中一項時遇到符號」AS「: 。,@ in <標識符> 分區子分區 「」 – 2012-04-20 17:35:47

+0

@BadProgrammer - 我發佈了一個顯示工作語法的示例。你能否更新你的問題以包含你目前使用的代碼? – 2012-04-20 18:05:42