Comment utiliser le type booléen dans la déclaration SELECT

j'ai une fonction PL/SQL avec BOOLEAN dans le paramètre:

function get_something(name in varchar2, ignore_notfound in boolean);

cette fonction fait partie d'un outil tiers, Je ne peux pas la changer.

je voudrais utiliser cette fonction à l'intérieur d'une instruction SELECT comme ceci:

 select get_something('NAME', TRUE) from dual;

Cela ne fonctionne pas, j'obtiens cette exception:

ORA-00904: "TRUE": invalid identifier

si je comprends bien, le mot clé TRUE n'est pas reconnu.

Comment puis-je faire ceci travail?

46
demandé sur AHiggins 2009-09-23 15:25:46

9 réponses

vous pouvez construire une fonction wrapper comme ceci:

function get_something(name in varchar2,
                   ignore_notfound in varchar2) return varchar2
is
begin
    return get_something (name, (upper(ignore_notfound) = 'TRUE') );
end;

puis appeler:

select get_something('NAME', 'TRUE') from dual;

c'est à vous de décider quelles sont les valeurs valides de ignore_notfound dans votre version, j'ai supposé que 'TRUE' signifie TRUE et que tout le reste signifie FALSE.

26
répondu Tony Andrews 2009-09-23 11:32:24

vous pouvez certainement obtenir une valeur booléenne à partir d'une requête SELECT, vous ne pouvez tout simplement pas utiliser un type de données booléen.

Vous pouvez représenter un Booléen avec 1/0.

CASE WHEN (10 > 0) THEN 1  ELSE 0 END (It can be used in SELECT QUERY)

SELECT CASE WHEN (10 > 0) THEN 1  ELSE 0 END AS MY_BOOLEAN_COLUMN
  FROM DUAL

Retourne, 1 (en veille prolongée/Mybatis/etc 1 est vrai). Sinon, vous pouvez obtenir des valeurs booléennes imprimables à partir d'un SELECT.

SELECT CASE WHEN (10 > 0) THEN 'true' ELSE 'false' END AS MY_BOOLEAN_COLUMN
 FROM DUAL

renvoie la chaîne 'true'.

42
répondu Ash 2014-04-25 10:58:24

documentation:

Vous ne pouvez pas insérer les valeurs TRUE et FALSE dans une colonne de base de données. Vous ne pouvez pas sélectionner ou récupérer des valeurs de colonne dans un BOOLEAN variable. Les fonctions appelées à partir d'un SQL la requête ne peut prendre aucun BOOLEAN paramètres. Ni intégré SQL fonctions TO_CHAR; représenter BOOLEAN valeurs en sortie, vous devez utiliser IF-THEN ou CASE construit pour traduire BOOLEANvaleurs dans un autre type, comme 0 ou 1,'Y' ou 'N','true' ou 'false', et ainsi de suite.

vous aurez besoin de faire une fonction wrapper qui prend un SQL type de données et l'utiliser à la place.

19
répondu Quassnoi 2015-04-08 14:50:36

le type de données booléen est une donnée PL / SQL type. Oracle ne fournit pas une type de données SQL équivalent (...) vous pouvez créer une fonction d'enrubannage qui Type SQL au type booléen.

Vérifier: http://forums.datadirect.com/ddforums/thread.jspa?threadID=1771&tstart=0&messageID=5284

5
répondu JuanZe 2009-09-23 11:35:13
select get_something('NAME', sys.diutil.int_to_bool(1)) from dual;
2
répondu Kanu Mundu 2011-12-27 08:06:16

compilez cela dans votre base de données et commencez à utiliser des déclarations booléennes dans vos querys.

note: la fonction get est un param varchar2, donc assurez-vous d'envelopper toutes les "chaînes" dans votre déclaration. Il sera de retour 1 pour vrai et 0 pour faux;

select bool('''abc''<''bfg''') from dual;

CREATE OR REPLACE function bool(p_str in varchar2) return varchar2 
 is
 begin

 execute immediate ' begin if '||P_str||' then
          :v_res :=  1;
       else
          :v_res :=  0;
       end if; end;' using out v_res;

       return v_res;

 exception 
  when others then 
    return '"'||p_str||'" is not a boolean expr.';
 end;
/
2
répondu Eran ben-ari 2012-09-13 12:13:28

la réponse à cette question est simple: N'utilisez pas de booléen avec Oracle -- PL/SQL est muet et cela ne fonctionne pas. Utilisez un autre type de données pour exécuter votre processus.

Une note de rapport SSRS avec les développeurs de source de données Oracle: vous pouvez utiliser des paramètres booléens, mais faites attention à la façon dont vous mettez en œuvre. Oracle PL / SQL ne joue pas bien avec BOOLEAN, mais vous pouvez utiliser la valeur booléenne dans le filtre de Tablix si les données résident dans votre ensemble de données. - Ce vraiment déclenché m', parce que j'ai utilisé le paramètre booléen avec Oracle data source. Mais dans ce cas, je filtrais les données Tablix, pas les requêtes SQL.

si les données ne sont pas dans vos champs de données SSRS, vous pouvez réécrire le SQL quelque chose comme ça en utilisant un paramètre entier:

__

<ReportParameter Name="paramPickupOrders">
  <DataType>Integer</DataType>
  <DefaultValue>
    <Values>
      <Value>0</Value>
    </Values>
  </DefaultValue>
  <Prompt>Pickup orders?</Prompt>
  <ValidValues>
    <ParameterValues>
      <ParameterValue>
        <Value>0</Value>
        <Label>NO</Label>
      </ParameterValue>
      <ParameterValue>
        <Value>1</Value>
        <Label>YES</Label>
      </ParameterValue>
    </ParameterValues>
  </ValidValues>
</ReportParameter>

...

<Query>
<DataSourceName>Gmenu</DataSourceName>
<QueryParameters>
  <QueryParameter Name=":paramPickupOrders">
    <Value>=Parameters!paramPickupOrders.Value</Value>
  </QueryParameter>
<CommandText>
    where 
        (:paramPickupOrders = 0 AND ordh.PICKUP_FLAG = 'N'
        OR :paramPickupOrders = 1 AND ordh.PICKUP_FLAG = 'Y' )

si les données sont dans vos champs de données SSRS, vous pouvez utiliser un filtre tablix avec un paramètre booléen:

__

</ReportParameter>
<ReportParameter Name="paramFilterOrdersWithNoLoad">
  <DataType>Boolean</DataType>
  <DefaultValue>
    <Values>
      <Value>false</Value>
    </Values>
  </DefaultValue>
  <Prompt>Only orders with no load?</Prompt>
</ReportParameter>

...

<Tablix Name="tablix_dsMyData">
<Filters>
  <Filter>
    <FilterExpression>
        =(Parameters!paramFilterOrdersWithNoLoad.Value=false) 
        or (Parameters!paramFilterOrdersWithNoLoad.Value=true and Fields!LOADNUMBER.Value=0)
    </FilterExpression>
    <Operator>Equal</Operator>
    <FilterValues>
      <FilterValue DataType="Boolean">=true</FilterValue>
    </FilterValues>
  </Filter>
</Filters>
0
répondu SherlockSpreadsheets 2018-08-15 13:26:54

PL / SQL se plaint que TRUE n'est pas un identifiant ou une variable valide. Définissez une variable locale, définissez-la à TRUE et passez-la dans la fonction get_something.

-1
répondu David Andres 2009-09-23 11:32:18

Que Diriez-vous d'utiliser une expression qui évalue vers TRUE (ou FALSE)?

select get_something('NAME', 1 = 1) from dual
-1
répondu Gart 2009-09-23 11:38:33