2017-08-31 88 views
0

我是PL/SQL的初學者。我需要編寫一個具有以下細節的函數:帶異常處理的PL/SQL函數

創建一個名爲'find_transaction_type'的函數,該函數將接受transaction_type_id作爲輸入。根據這個輸入,函數必須返回varchar類型的事務類型名稱。

功能名稱:find_transaction_type,

輸入參數:transaction_type_id在INT

設計規則:

1)如果交易類型ID(即transaction_type_id)作爲輸入傳遞,id爲在比賽中事務表,然後它返回給定的transaction_type_id的類型。

2)如果交易類型ID作爲輸入傳遞,不會在交易表中的ID匹配,那麼它會拋出「NO_DATA_FOUND」異常,並以文本爲「沒有這樣的類型」

注意其顯示:使用變量來打印異常,而不是'dbms_output.put_line' ie:umpire_name:='沒有這樣的裁判';

我的解決辦法是:

create or replace function find_transaction_type(transaction_type_id in integer) return varchar is 
      transaction_type_name varchar(255); 
      type_id    integer; 
      error_msg    varchar(255); 
     begin 
      error_msg := 'No such Type'; 
      select id 
      into type_id 
      from transaction_type; 
      if type_id = transaction_type_id 
      then 
       select type 
       into transaction_type_name 
       from transaction_type 
       where id = transaction_type_id; 
       return(transaction_type_name); 
      else 
       raise no_data_found; 
      end if; 
     exception 
      when no_data_found then 
       raise_application_error(-10403, error_msg); 
     end; 
/

這有什麼錯我的代碼?

+0

除了缺乏任何縮進以使其可讀? :-)那麼,你的第一個'select'沒有where子句,所以將返回'transaction_type'中的所有行,而不僅僅是你想要的。 –

回答

0
  1. 使用varchar2而不是varchar。
  2. 將where子句添加到第一個select語句。
  3. 如果你做了2,那麼如果其他人不需要。
1

您不需要第一次選擇,也不需要if語句。只要讓查詢引發no_data_found異常。請參閱各自表格的類型。

create or replace function find_transaction_type (
    transaction_type_id in transaction_type.transaction_type_id%type 
    ) 
    return transaction_type.type%type is 
     transaction_type_name transaction_type.type%type; 
    begin 
     select type -- not a good column name 
     into transaction_type_name -- this should be the column name also 
     from transaction_type 
     where id = transaction_type_id; 
     return transaction_type_name; 
    exception 
     when no_data_found then 
      if transaction_type_id is null then 
      raise_application_error(-10403, "type argument is null"); 
      else 
      raise_application_error(-10403, "type '" || transaction_type_id || "' not found"); 
      end if; 
    end;