2010-10-21 136 views
60

我想運行一個存儲過程,有多個進出參數。該過程只能通過導航其他用戶|在我的「連接」面板中查看|包| | |在SQL Developer中運行存儲過程?

如果我右鍵單擊,菜單項是「Order Members By ...」和「Create Unit Test」(灰色)。用戶訪問該程序時,「運行」該程序的功能似乎不可行。

我一直在試圖找到一個如何創建一個匿名塊的例子,以便我可以作爲一個SQL文件運行過程,但還沒有找到任何可行的方法。

有誰知道我可以從SQL Developer中執行這個過程嗎?我正在使用版本2.1.1.64。

在此先感謝!

編輯1:

我想打電話的過程有這樣的簽名:

user.package.procedure(
    p_1 IN NUMBER, 
    p_2 IN NUMBER, 
    p_3 OUT VARCHAR2, 
    p_4 OUT VARCHAR2, 
    p_5 OUT VARCHAR2, 
    p_6 OUT NUMBER) 

如果我寫我喜歡這個匿名塊:

DECLARE 
    out1 VARCHAR2(100); 
    out2 VARCHAR2(100); 
    out3 VARCHAR2(100); 
    out4 NUMBER(100); 
BEGIN 
    EXECUTE user.package.procedure (33,89, :out1, :out2, :out3, :out4); 
END; 

我得到的錯誤:

Bind Varialbe "out1" is NOT DECLCARED 
anonymous block completed 

我已經試過初始化出*變量:

out1 VARCHAR2(100) := ''; 

,但得到了同樣的錯誤:

編輯2:

根據Alex的答案,我試圖消除由冒號在參數前面,並得到這個:

Error starting at line 1 in command: 
DECLARE 
    out1 VARCHAR2(100); 
    out2 VARCHAR2(100); 
    out3 VARCHAR2(100); 
    out4 NUMBER(100); 
BEGIN 
    EXECUTE user.package.procedure (33,89, out1, out2, out3, out4); 
END; 
Error report: 
ORA-06550: line 13, column 17: 
PLS-00103: Encountered the symbol "USER" when expecting one of the following: 

    := . (@ % ; immediate 
The symbol ":=" was substituted for "USER" to continue. 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 
*Action: 
+0

[最好的方法/工具從oracle包過程中得到結果]的可能的重複(http://stackoverflow.com/questions/3526798/best-way-tool-to-get-the-results-from- an-oracle-package-procedure) – 2010-10-21 20:52:33

+0

嘗試在過程執行語句之前將OUT變量放入BEGIN中。 – 2010-10-21 21:56:00

+0

你不需要'execute';在PL/SQL中被解釋爲'execute immediate'的開始,這與SQL'execute'不同。 – 2010-10-21 22:08:41

回答

63

使用簡單的參數類型(即不包括refcursors等)),你可以做這樣的事情:

SET serveroutput on; 
DECLARE 
    InParam1 number; 
    InParam2 number; 
    OutParam1 varchar2(100); 
    OutParam2 varchar2(100); 
    OutParam3 varchar2(100); 
    OutParam4 number; 
BEGIN 
    /* Assign values to IN parameters */ 
    InParam1 := 33; 
    InParam2 := 89; 

    /* Call procedure within package, identifying schema if necessary */ 
    schema.package.procedure(InParam1, InParam2, 
     OutParam1, OutParam2, OutParam3, OutParam4); 

    /* Display OUT parameters */ 
    dbms_output.put_line('OutParam1: ' || OutParam1); 
    dbms_output.put_line('OutParam2: ' || OutParam2); 
    dbms_output.put_line('OutParam3: ' || OutParam3); 
    dbms_output.put_line('OutParam4: ' || OutParam4); 
END; 
/


編輯使用OP的規格,並用另一種方法,利用 :var綁定變量:

var InParam1 number; 
var InParam2 number; 
var OutParam1 varchar2(100); 
var OutParam2 varchar2(100); 
var OutParam3 varchar2(100); 
var OutParam4 number; 

BEGIN 
    /* Assign values to IN parameters */ 
    :InParam1 := 33; 
    :InParam2 := 89; 

    /* Call procedure within package, identifying schema if necessary */ 
    schema.package.procedure(:InParam1, :InParam2, 
     :OutParam1, :OutParam2, :OutParam3, :OutParam4); 
END; 
/

-- Display OUT parameters 
print :OutParam1; 
print :OutParam2; 
print :OutParam3; 
print :OutParam4; 
+1

+1好的答案。出於好奇,你知道哪個是首選? – 2010-10-21 23:05:39

+0

@康拉德:我想它是一個偏好的事情,儘管可能有更多的上下文切換':var'的方式。如果我對PL/SQL做任何事情,我會默認使用'declare'方式;但是如果我正在使用從Pro * C複製的已有代碼中已有的語法,並且我不想在調用中觸摸parms,那麼我可以使用':var'。 – 2010-10-22 06:41:02

+1

感謝您的幫助和詳細的答案。我相信這對別人也是一種幫助。有一點要注意的是,這些必須作爲腳本而不是語句運行。 – sdoca 2010-10-22 16:15:12

23

執行簡單。獲得結果可能很困難。

看看這個問題,我問Best way/tool to get the results from an oracle package procedure

它的總結是這樣的。

假設您有一個名爲mypackage的包和名爲getQuestions的過程。它返回一個refcursor並接受字符串用戶名。

您所要做的就是創建新的SQL文件(新文件)。設置連接並粘貼到下面並執行。

var r refcursor; 
exec mypackage.getquestions(:r, 'OMG Ponies'); 
print r; 
+3

我不得不使用完整的單詞「執行」而不是「執行」 – Patrick 2014-11-21 23:01:25

4

用途:

BEGIN 

    PACKAGE_NAME.PROCEDURE_NAME(parameter_value, ...); 

END; 

替換 「PACKAGE_NAME」, 「PROCEDURE_NAME」 和 「PARAMETER_VALUE」 你需要什麼。 OUT參數需要在之前聲明。

7

打開過程中的SQL開發人員並從那裏運行它。 SQL Developer顯示它運行的SQL。

BEGIN 
    PROCEEDURE_NAME_HERE(); 
END; 
-3
var out_para_name refcursor; 
execute package_name.procedure_name(inpu_para_val1,input_para_val2,... ,:out_para_name); 
print :out_para_name; 
0

不能相信,這不會在SQL Developer中執行:

var r refcursor; 
exec PCK.SOME_SP(:r, 
'02619857'); 

print r; 

但這會:

var r refcursor; 
exec TAPI_OVLASCENJA.ARH_SELECT_NAKON_PRESTANKA_REG(:r, '02619857'); 

print r; 

顯然,一切都必須在一行..

+2

[執行]命令的[SQL * Plus文檔]聲明。這不是對問題的回答,儘管已經被問到了,並且已經在[無論如何在其他問題的更多相關答案](http://stackoverflow.com/a/15649958/266304)中被覆蓋。 – 2013-07-05 10:55:00

+0

能夠在SQL Developer中使用它。謝謝 – Sergejs 2015-09-16 09:18:15

-1

我無法獲得@Alex Poole a nswers工作。但是,通過試驗和錯誤,我發現了以下工作(使用SQL Developer 3.0.04版)。萬一在這裏張貼它可以幫助別人:

SET serveroutput on; 

DECLARE 
    var InParam1 number; 
    var InParam2 number; 
    var OutParam1 varchar2(100); 
    var OutParam2 varchar2(100); 
    var OutParam3 varchar2(100); 
    var OutParam4 number; 

BEGIN 
    /* Assign values to IN parameters */ 
    InParam1 := 33; 
    InParam2 := 89; 

    /* Call procedure within package, identifying schema if necessary */ 
    schema.package.procedure(InParam1, InParam2, 
     OutParam1, OutParam2, OutParam3, OutParam4); 

    /* Display OUT parameters */ 
    dbms_output.put_line('OutParam1: ' || OutParam1); 
    dbms_output.put_line('OutParam2: ' || OutParam2); 
    dbms_output.put_line('OutParam3: ' || OutParam3); 
    dbms_output.put_line('OutParam4: ' || OutParam4); 
END; 
+2

這與我答案中的第一個版本相同,只是你在'declare'塊中的每個變量中添加了一個'var',這是無效的。嘗試運行此命令會產生'PLS-00103:遇到下列其中一個...時出現符號「NUMBER」,並且與其他五個變量相似的錯誤。 – 2013-11-20 13:24:12

+0

我同意亞歷克斯。因爲'var',因此我不需要在我的調用中使用'.package.',至少在3.2.20.10中應該不會這麼差,並且當我這樣做時會出錯。用這個答案浪費了很多時間。 – vapcguy 2016-08-30 21:22:03

0

使用SQL Developer版本4.0.2.15構建15.21以下工作:

SET SERVEROUTPUT ON 
var InParam1 varchar2(100) 
var InParam2 varchar2(100) 
var InParam3 varchar2(100) 
var OutParam1 varchar2(100) 

BEGIN 
    /* Assign values to IN parameters */ 
    :InParam1 := 'one'; 
    :InParam2 := 'two'; 
    :InParam3 := 'three'; 

    /* Call procedure within package, identifying schema if necessary */ 
    schema.package.procedure(:InParam1, :InParam2, :InParam3, :OutParam1); 
    dbms_output.enable; 
    dbms_output.put_line('OutParam1: ' || :OutParam1); 
END; 
/
+0

不,對不起, - var之前變量不起作用 - 至少在SQL Developer 3.2.20.10中,不應該在它們前面使用冒號 - 不需要它,至少在3.2.20.10(唯一的原因是我沒有投票或編輯它)。 'SET SERVEROUTPUT ON'後也需要一個分號。 – vapcguy 2016-08-30 21:17:59

8

對於使用的SQLDeveloper 3+這些,如果你錯過了:

SqlDeveloper具有直接執行存儲過程/函數的功能,並且輸出以易於閱讀的方式顯示。

在包/存儲過程/存儲功能,只需右鍵點擊,點擊Run並選擇target是PROC/FUNC要執行,的SQLDeveloper將生成的代碼片段執行(這樣你可以把你的輸入參數)。一旦執行,輸出參數將顯示在對話框的下半部分,甚至內置了對參考光標的支持:光標結果將顯示爲單獨的輸出選項卡。

+0

這應該是選定的答案。 – EvilTeach 2017-06-14 19:36:24

-2

如果你有很多程序有很多參數,創建PI/SQL塊會很痛苦。有一個application寫在python上,爲你做。 它使用過程聲明解析文件並創建Web應用程序以便於過程調用。

1

這些其他答案都不適合我。這是我必須做在SQL Developer中3.2.20.10運行一個過程:

SET serveroutput on; 
DECLARE 
    testvar varchar(100); 
BEGIN 
    testvar := 'dude'; 
    schema.MY_PROC(testvar); 
    dbms_output.enable; 
    dbms_output.put_line(testvar); 
END; 

然後你不得不去檢查無論你的PROC應該將表做傳入的變量 - - 輸出將確認變量接收到該值(理論上,將其傳遞給proc)。

備註(與我的差異與其他):

  • 沒有:變量名
  • 之前沒有把.package..packages.模式名,有沒有把一個&在變量的值的過程名稱
  • 之間。
  • 沒有使用print隨時隨地
  • 沒有使用var聲明變量

所有這些問題都留給我抓我的頭最長和這些答案有這些令人震驚的錯誤出要取出,柏油羽毛。