【问题标题】:PL/SQL function to check for invalid characters in a stringPL/SQL 函数检查字符串中的无效字符
【发布时间】:2021-07-20 14:08:38
【问题描述】:

我试图在 pl/sql 中创建一个函数,该函数将接受字符串并将字符串拆分为一个数组,然后将拆分字符串的数组与存储在数据库中的无效字符进行比较。

我还在试验,没有测试过 apex_string.split,因为我遇到了这些错误: 错误(7,1):PLS-00103:在预期以下情况之一时遇到符号“DECLARE”:开始函数杂注过程子类型类型当前游标删除之前存在符号“开始”替换“声明”以继续。

错误(38):PLS-00103:在预期以下情况之一时遇到符号“文件结尾”:(begin case declare end exception exit for goto if loop mod null pragma raise return select update while with

我对 PL/SQL 有点陌生,我对任何 cmets 持开放态度

谢谢

create or replace FUNCTION invalid_checker(inword IN varchar2)
RETURN boolean
IS 
    hasInvalid boolean;


declare
    CURSOR invalids IS select invalidChar from InvalidCharacter;  --table that contains the invalid characters
    Type wordsplit IS VARRAY(100) OF VARCHAR2(2);
    splitcount INTEGER;
    invalidscount INTEGER ;
    ctr INTEGER := 0;
    invalidctr INTEGER :=0;
    wordarray wordsplit;    
    
begin

open invalids;

wordarray := wordsplit(apex_string.split(inword, null));--split inserted word into array
--splitcount := wordsplit.count
--invalidsctr := invalids.count

FOR splitcount IN wordarray LOOP
    ctr := ctr + 1;
    FOR invalidscount IN invalids LOOP
        invalidctr := invalidctr + 1;
        IF (wordarray(ctr) = invalids(invalidctr)) THEN
            hasInvalid := true;
        END IF;
    END LOOP;
END LOOP;

close invalids;

RETURN hasInvalid;
end;
/

【问题讨论】:

  • 直接删除declare,不需要。

标签: oracle plsql oracle-apex


【解决方案1】:
  • 删除DECLARE 关键字,因为它不需要。

  • 您想使用以下方法迭代数组:

    FOR splitcount IN 1 .. wordarray.COUNT LOOP
    

    并且您不需要声明 splitcount 变量。

  • 您不能多次读取CURSOR。而不是 CURSOR 使用 SELECT ... BULK COLLECT INTO ... 并将无效值收集到一个集合中(并且您可以多次读取)。

不过,看起来你可以简化很多:

CREATE FUNCTION invalid_checker(inword IN varchar2)
RETURN boolean
IS 
  hasinvalid INTEGER ;    
BEGIN
  SELECT 1
  INTO   hasInvalid
  FROM   (
           SELECT SUBSTR(inword, LEVEL, 1) AS ch
           FROM   DUAL
           CONNECT BY LEVEL <= LENGTH(inword)
         ) c
         INNER JOIN InvalidCharacter i
         ON ( c.ch = i.invalidchar )
  FETCH FIRST ROW ONLY;

  RETURN TRUE;
EXCEPTION
  WHEN NO_DATA_FOUND THEN
    RETURN FALSE;
END;
/

那么,如果你有:

CREATE TABLE InvalidCharacter ( invalidchar ) AS
SELECT 'A' FROM DUAL UNION ALL
SELECT 'C' FROM DUAL UNION ALL
SELECT 'E' FROM DUAL;

然后运行:

DECLARE
  words SYS.ODCIVARCHAR2LIST := SYS.ODCIVARCHAR2LIST(
    'BDF',
    'ACE',
    'BDE',
    'ace'
  );
BEGIN
  FOR i IN 1 .. words.COUNT LOOP
    IF invalid_checker( words(i) ) THEN
      DBMS_OUTPUT.PUT_LINE( words(i) || ' invalid' );
    ELSE
      DBMS_OUTPUT.PUT_LINE( words(i) || ' valid' );
    END IF;
  END LOOP;
END;
/

输出是:

BDF valid
ACE invalid
BDE invalid
ace valid

db小提琴here

【讨论】:

    【解决方案2】:

    我看到这个问题并想,为什么要调用 PL/SQL?这可以用 SQL 来回答。

    CREATE TABLE InvalidCharacter ( invalidchar ) AS
    SELECT 'A' FROM DUAL UNION ALL
    SELECT 'C' FROM DUAL UNION ALL
    SELECT 'E' FROM DUAL;
    
    select * from apex_string.split('ORACLE','')
    where column_value not in (select invalidchar from invalidcharacter);
    
    Result Sequence
    ---------------
    O
    R
    L
    

    【讨论】:

    • 此 SQL 的确切部署将取决于您的特定需求/输入,但它表明它可以在没有 PL/SQL 的情况下捆绑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 2019-06-29
    • 1970-01-01
    • 2011-04-12
    • 2015-07-14
    • 2013-02-05
    相关资源
    最近更新 更多