PL-SQL - 有人可以告诉我这段代码在做什么

时间:2010-12-03 14:04:01

标签: oracle plsql

 FUNCTION encounter_for_dataset(p_check_answer_master_id IN check_list_answer_master.check_answer_master_id%TYPE) RETURN NUMBER
  IS

    l_key_type      check_list_answer_master.key_type%TYPE;
    l_key           check_list_answer_master.key%TYPE;
    l_encounter_id  NUMBER := 0;

  BEGIN

    IF p_check_answer_master_id IS NOT NULL THEN

      SELECT clam.key_type, NVL(clam.key,'0')
      INTO   l_key_type, l_key
      FROM check_list_answer_master clam
      WHERE clam.check_answer_master_id = p_check_answer_master_id;

      IF l_key_type = 'E' THEN

        BEGIN
          l_encounter_id := TO_NUMBER(l_key);
        EXCEPTION
          WHEN OTHERS THEN
            l_encounter_id := 0;
        END;

      END IF; -- l_key_type = 'E'

    END IF; -- p_check_answer_master_id is not null

    RETURN l_encounter_id;

  END encounter_for_dataset;

3 个答案:

答案 0 :(得分:4)

这是一个逐行摘要

FUNCTION encounter_for_dataset(
    p_check_answer_master_id IN check_list_answer_master.check_answer_master_id%TYPE 
    --this is the input variable (note the table.column%type this forces the variable to adhere that the column type if it changes
    ) RETURN NUMBER --what type to return
  IS
  /** declaration section, note it is using the table.column%type --this is good practice in case they change
  */
    l_key_type      check_list_answer_master.key_type%TYPE;
    l_key           check_list_answer_master.key%TYPE;
    l_encounter_id  NUMBER := 0;

  BEGIN
    --if the passed in value is NOT null do the logic within the IF statement
    IF p_check_answer_master_id IS NOT NULL THEN


      --insert key_type into l_key_type,
      --and insert the key (if null then 0) into l_key
      --where the check_answer_master_id is equal to the passed in variable
      --DO NOTE, IF THERE is NO DATA FOUND it will throw a NO_DATA_FOUND exception which is not handled
      SELECT clam.key_type, NVL(clam.key,'0')
      INTO   l_key_type, l_key
      FROM check_list_answer_master clam
      WHERE clam.check_answer_master_id = p_check_answer_master_id;

      -- if the key type is e, then 'cast' the l_key into a number
      --when any exception happens during the 'cast' just set it to 0
      IF l_key_type = 'E' THEN

       /**this begin..end block allows encapsulation of exception logic as it is used, pretty much a nested try/catch within the function -- this error will not bubble up to the calling program, whereas if the p-check_answer_master_id is not in clam, then that error will bubble up*/
        BEGIN 
          l_encounter_id := TO_NUMBER(l_key);
        EXCEPTION
          WHEN OTHERS THEN
            l_encounter_id := 0;
        END;

      END IF; -- l_key_type = 'E'

    END IF; -- p_check_answer_master_id is not null

       --retrun the value (note it defaults to 0)
    RETURN l_encounter_id;

  END encounter_for_dataset;

答案 1 :(得分:4)

Oracle documentation可以从互联网上免费获得。它对于新手用户来说是相当可读和有用的。如果兰迪没有满意地回答这个问题,PL/SQL user guideSQL Reference将是一个很好的起点。

这是创建一个函数,它在值中传递并返回一个数字。传入的值用于查找表,基于表中找到的值传递不同的值。如果l_key_type(在表中找到)则返回l_key的值,否则返回0.

答案 2 :(得分:3)

有人传了一个号码,

然后如果该数字不为空,

从check_list_answer_master表中查询密钥类型

如果该类型为“E”,则将密钥返回为“encounter_id”

否则返回0