簡體   English   中英

在Oracle pl / sql函數中定義類型

[英]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. 

我的猜測是我把聲明放在錯誤的地方,但我無法弄清楚應該去哪里。

您在代碼中有太多語法錯誤。

  1. oracle中的賦值使用:=和not =完成
  2. 數組索引使用()而不是[]引用
  3. 您不能將值賦給IN變量numericId = numericId / targetBase
  4. 檢查循環語句的語法 - 您缺少結束循環
  5. 要獲取數組計數,請使用COUNT()

    正如評論所暗示的那樣

  6. 刪除聲明

除了語法問題,還有一些額外的要點:

在循環之前檢查輸入變量(以避免無限循環)

使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM