【问题标题】:PLSQL Check if varchar2 contains TruePLSQL 检查 varchar2 是否包含 True
【发布时间】:2021-08-07 18:07:09
【问题描述】:

我写了一个 PLSQL 脚本,它应该检查一个选定的行是否包含 TRUE 如果是 then 他应该给我打印一个文本.. 但他获取的不止一个行。

DECLARE

tmp varchar2(20);

BEGIN

Select Status into tmp 
From Cdb_Dv_Status;

    IF tmp = 'TRUE' THEN
    DBMS_Output.put_line('the output is false');
    ELSE
    DBMS_Output.put_line('the output is true');
    END IF;
end;
/

这是我用 SQL 选择它时得到的结果

NAME                     STATUS         
-------------------      ----------- 
DV_ENABLE_STATUS           FALSE            
DV_APP_PROTECTION          NOT CONFIGURED       
DV_CONFIGURE_STATUS        FALSE            
DV_APP_PROTECTION          NOT CONFIGURED      
DV_ENABLE_STATUS           FALSE            
DV_CONFIGURE_STATUS        FALSE           
DV_APP_PROTECTION          NOT CONFIGURED      
DV_CONFIGURE_STATUS        FALSE            
DV_ENABLE_STATUS           FALSE           
DV_CONFIGURE_STATUS        FALSE            
DV_APP_PROTECTION          NOT CONFIGURED      
DV_ENABLE_STATUS           FALSE    

这也不起作用..他告诉我我必须声明 tmp

    BEGIN
  for rec in (
    select status tmp
      from Cdb_Dv_Status
  )loop
    IF rec.tmp='TRUE' then
    dbms_output.put_line('Database Vault wird genutzt');
    end if;

   end loop;

    IF rec.tmp='TRUE' then 
        dbms_output.put_line('wird genutzt');

    ELSE 
    dbms_output.put_line('Database Vault wird nicht genutzt');

    END IF;

end;
/

   

【问题讨论】:

  • 包含还是相等?它有一些不同......
  • 你想在 PL/SQL 代码中做什么?在 SQL 查询中,您会得到“true”、“false”或其他值,表中的每一行对应一个值。在该过程中,您似乎想在变量中选择一个值 - 但SELECT 查询将返回很多值,而不是一个值。所以代码不可能是正确的;但如果我们甚至不知道您要解决什么问题,我们也无法帮助您解决问题。
  • 他应该检查返回的状态......“假”、“未配置”如果其中之一为真他应该返回“真它已使用”否则“未使用”

标签: sql oracle plsql


【解决方案1】:

您可能会得到一些 too_many_rowsno_data_found 异常,具体取决于当前案例的数据,而不是更喜欢使用 COUNT 聚合,如以下代码块中所示存在

DECLARE
  tmp INT;
BEGIN
  SELECT COUNT(*) 
    INTO tmp 
    FROM Cdb_Dv_Status
   WHERE Status = 'TRUE';

  IF tmp > 0 THEN
    DBMS_Output.put_line('the output is true');
  ELSE
    DBMS_Output.put_line('the output is false');
  END IF;
END;
/

Demo

【讨论】:

  • 感谢您的帮助,但他跳过了 if tmp>0 并仅返回 else 语句在我的情况下,他应该返回 false,但当我使用普通 sql 语句返回 true 时,返回是“现在已选择行”
  • 这对 OP 的代码应该做什么做出了巨大的(且未说明的)假设。你(我们)怎么知道那是 OP 的实际用例?
  • @Chicken2 符合预期,因为您当前的数据对于相关值没有任何值 TRUE
  • 是的,但我将 tmp>0 更改为 tmp=0 也不起作用
  • 您的查询解决了以下问题:“如果值 'TRUE' 在 status 中至少出现一次,则打印 输出为 true柱子。”原始问题中的什么表明这就是 OP 试图做的?显然他的代码没有这样做,我也没有在解释中看到它。我看到“如果其中一行......” - 这是否意味着“至少一个”?是“完全一样”的意思吗?这是否意味着“一个特定的”?等
【解决方案2】:

如果您需要做的只是检查值'TRUE' 是否在表(或视图)STATUS 的列STATUS 中至少出现一次CDB_DV_STATUS,您可以执行以下操作:

declare
  str varchar2(5);
begin
  select case when 'TRUE' in (select status from cdb_dv_status)
              then 'true' else 'false' end
    into str
    from dual;
  dbms_output.put_line('The output is ' || str);
end;
/

【讨论】:

    猜你喜欢
    • 2019-07-19
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 2014-10-08
    • 2020-01-09
    • 2013-08-04
    • 2011-11-10
    相关资源
    最近更新 更多