2015-04-21 56 views
1

我正在嘗試編寫PL SQL函數,但是我在格式化和一般語法方面遇到了一些問題。PL SQL函數問題

這是我的當前代碼:

create or replace function getName(name IN varchar, organisation OUT varchar, 
        xcoord OUT number, ycoord OUT number, errormsg OUT varchar) 
return varchar2 
as 
begin 
    Select name, LOCX, LOCY 
    from BBT_POI 
    WHERE (UPPER(name) LIKE UPPER('%'|| NAME || '%')); 
    return NAME; 
end; 
/

variable input varchar; 
Variable errormsg varchar; 
Variable organisation varchar; 
Variable x NUMBER; 
Variable y NUMBER; 


execute getName ('yach', organisation, x, y, errormsg); 

和這些是錯誤消息時我運行創建或替換功能的命令:

FUNCTION GETNAME compiled 
Errors: check compiler log 

錯誤(5,3):PLS-00428 :在這個SELECT語句中預計會出現INTO子句

當我運行執行行時,我得到:

Error starting at line : 40 in command - 
execute getName ('yach', organisation, x, y, errormsg) 
Error report - 
ORA-06550: line 1, column 24: 
PLS-00201: identifier 'ORGANISATION' must be declared 
ORA-06550: line 1, column 7: 
PL/SQL: Statement ignored 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 
*Action: 

該過程應該帶一個IN參數(名稱或名稱的一部分),並返回四個OUT參數(組織名稱,X座標,Y座標,錯誤消息(如果沒有錯誤則爲'無'消息被拋出))。

我目前知道代碼不會查找錯誤,但我只是想獲得一個簡單的版本,我可以在其中添加更多的功能。

+1

PL/SQL是否真正與MySQL一起工作?考慮標記Oracle? – jarlh

+0

錯誤很明顯。你需要一個'into'子句,一個變量,並在'return'語句中使用這個變量。 –

回答

2

您的代碼有幾個問題: 首先,您遇到了PLS-00428錯誤,這意味着您沒有提供INTO子句。
實施例:

create or replace function getName(name IN varchar, organisation OUT varchar, 
        xcoord OUT number, ycoord OUT number, errormsg OUT varchar) 
return varchar2 
as 
begin 
    Select name, LOCX, LOCY 
    INTO name, XCOORD, YCOORD -- I assume this is how you need them kept 
    from BBT_POI 
    WHERE (UPPER(name) LIKE UPPER('%'|| NAME || '%')); 
    return NAME; 
end; 
/

接着你的下一個塊必須被定義爲一個匿名塊。 Oracle不知道你正在嘗試使用PL/SQL,除非你明確地告訴它你是。
所以,你的變量的東西需要在一個塊(你也不用說了變量):

DECLARE 
input varchar; 
errormsg varchar; 
organisation varchar; 
x NUMBER; 
y NUMBER; 
BEGIN 
    getName('yach', organisation, x, y, errormsg); 
END; 
/
1

我沒有工具,現在來檢查它是否工作是肯定的,但這種嘗試:

create or replace function getName(p_name IN varchar, organisation OUT varchar, 
        xcoord OUT number, ycoord OUT number, errormsg OUT varchar) 
return varchar2 
as 
begin 
    Select name, LOCX, LOCY 
    INTO p_name, xcoord, coord 
    from BBT_POI 
    WHERE (UPPER(p_name) LIKE UPPER('%'|| p_name || '%')); 
    return p_name; 
end; 
/

declare 
    input varchar; 
    errormsg varchar; 
    organisation varchar; 
    x NUMBER; 
    y NUMBER; 
begin 
    input:=getName ('yach', organisation, x, y, errormsg); 
end;