[英]Defining a type inside an Oracle pl/sql function
我正在嘗試創建一個pl / sql函數(我在pl / sql函數中的第一個函數),它將基數為10的數字轉換為基數為26的字符串(我的基數26將是A..Z)。
create or replace function generateId(numericId IN NUMBER) RETURN VARCHAR2 AS
declare
type array_t is varray(26) of CHAR;
char_array array_t := array_t('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
res varchar2(3);
targetBase INTEGER := char_array.count;
begin
LOOP
res = char_array[REMAINDER(numericId, targetBase)] + result;
numericId = numericId / targetBase;
EXIT WHEN (numericId = 0);
RETURN res;
end;
我得到的錯誤是:
Error(2,1): PLS-00103: Encountered the symbol "DECLARE" when expecting one of the following: begin function pragma procedure subtype type <an identifier> <a double-quoted delimited-identifier> current cursor delete exists prior external language The symbol "begin" was substituted for "DECLARE" to continue.
我的猜測是我把聲明放在錯誤的地方,但我無法弄清楚應該去哪里。
您在代碼中有太多語法錯誤。
numericId = numericId / targetBase
要獲取數組計數,請使用COUNT()
正如評論所暗示的那樣
刪除聲明
除了語法問題,還有一些額外的要點:
在循環之前檢查輸入變量(以避免無限循環)
使用MOD和FLOOR而不是使用ROUND的REMAINDER
這里有一個示例解決方案(沒有數組 - 可以輕松添加)
create or replace function generateId(numericId IN NUMBER) RETURN VARCHAR2 AS
v_num NUMBER;
res varchar2(100);
begin
v_num := numericId;
if (v_num < 0 OR v_num != trunc(v_num)) then
return NULL; /* or raise exeption */
end if;
LOOP
res := chr(ascii('A') + MOD(v_num, 26)) || res;
v_num := FLOOR(v_num/26);
EXIT WHEN (v_num = 0);
END LOOP;
RETURN res;
end;
/
select generateId(35286) code from dual;
CODE
-----
CAFE
簡單地刪除聲明 。
根據語法規則(例如此處 ),它不屬於那里。
在CREATE OR REPLACE之后無需寫入聲明。 您的聲明部分已從create關鍵字開始。 如果你不想把它放在無限循環中,那么應該有結束循環。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.