【问题标题】:Is the code I wrote correct or are there more optimized approaches to solve the problem?我写的代码是正确的还是有更优化的方法来解决问题?
【发布时间】:2021-12-11 01:31:05
【问题描述】:

我有一个类似的 srting p_balances:

balances|100095|5800870-989095-3|Mb|10240.0|10240|0.0|3|2021-11-22T10:12:31.000+06:00^balances|989011|5800870-989011-3|Min|16666666666666666|0|-16666666666666666|3|2021-11-22T10:12:31.000+06:00

我想在我的函数中返回,如果 1 为真,0 为假。 我的表 service_id_map 包含列 npararam1(其中有 989011, 100095, 100096 等数据)

我写的函数有效,但是有没有更优化的方法来获得结果?

CREATE OR REPLACE FUNCTION find_option_func(p_balances IN VARCHAR2)
  RETURN NUMBER IS
  v_result NUMBER;
  ex EXCEPTION;
BEGIN
  FOR i IN (SELECT t.npararam1 FROM service_id_map t) LOOP
    BEGIN
      IF instr(p_balances, '|' || i.npararam1 || '|') > 0 THEN
        v_result := 1;
        EXIT;
      ELSE
        RAISE ex;
      END IF;
    EXCEPTION
      WHEN ex THEN
        v_result := 0;
    END;
  END LOOP;
  RETURN v_result;
END find_option_func;

【问题讨论】:

    标签: sql oracle plsql


    【解决方案1】:

    你可以这样做:

    CREATE OR REPLACE FUNCTION find_option_func(p_balances IN VARCHAR2)
      RETURN NUMBER IS
      v_result NUMBER;
    BEGIN
      SELECT COUNT(*)
        INTO v_result
        FROM service_id_map t
       WHERE instr(p_balances, '|' || t.npararam1 || '|') > 0
         AND ROWNUM = 1;
    
      RETURN v_result;
    END find_option_func;
    

    【讨论】:

    • 我认为在这种情况下,ex 异常变量没有意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-07
    • 1970-01-01
    相关资源
    最近更新 更多