Avatar billede nicb Nybegynder
03. juli 2006 - 11:03 Der er 13 kommentarer

Brug for 1 variabel i et view som sætter værdien for 4 kolonner

Jeg har en function som returnerer en tekst streng.
Jeg skal lave 4 kolonner i et view på baggrund af værdien fra den streng som jeg får retur.

VariableXX = fx_Prod_Rap_Status(XX.DateTime,YY.Line)

Hvis VariableXX = 'SET' skal
Kolonne 1 = '1'
Kolonne 2 = '0'
Kolonne 3 = '0'
Kolonne 4 = '0'

Hvis VariableXX = 'PRC' skal
Kolonne 1 = '0'
Kolonne 2 = '1'
Kolonne 3 = '0'
Kolonne 4 = '0'

OSV...

Har brug for at vide hvordan man declarerer 1 variabel og sætter værdierne for 4 kolonner på baggrund af værdien af variablen.

Nicolai
Avatar billede hgc Nybegynder
03. juli 2006 - 11:10 #1
Du må kunne bruge case, f.eks

select case when variableXX = 'SET' then '1' else null end kolonne1,
      case when variableXX = 'SET' then '0' else null end kolonne2,
      ...
  from ...

vh Henning
Avatar billede nicb Nybegynder
03. juli 2006 - 11:14 #2
Hvordan får jeg sat en variabel = mit functionskald, i et view.

Nicolai
Avatar billede pgroen Nybegynder
03. juli 2006 - 11:28 #3
For at bruge hqc's eksempel, mener du så noget i stil med følgende ?

CREATE VIEW <viewnavn>
AS
  SELECT CASE
          WHEN fx_Prod_Rap_Status (XX.DateTime, YY.Line) = 'SET'
            THEN '1'
          ELSE NULL
        END kolonne1,
        CASE
          WHEN fx_Prod_Rap_Status (XX.DateTime, YY.Line) = 'PRC'
            THEN '0'
          ELSE NULL
        END kolonne2,
        ....osv
    FROM xx, yy
  WHERE ..<en eller anden join condition>
Avatar billede pgroen Nybegynder
03. juli 2006 - 11:30 #4
Eller alternativt:

CREATE VIEW viewnavn
AS
  SELECT DECODE (fx_Prod_Rap_Status (XX.DateTime, YY.Line), 'SET', 1, NULL) kolonne1,
        DECODE (fx_Prod_Rap_Status (XX.DateTime, YY.Line), 'PRC', 1, NULL) kolonne2,
        ....osv
    FROM xx, yy
--  WHERE ..<en eller anden join condition>
Avatar billede nicb Nybegynder
03. juli 2006 - 11:33 #5
Som jeg læser koden foretager jeg det samme funktionskald flere gange, hvor mit mål er kun et kald. Og derefter indsætter jeg værdien i en variabel, som jeg kan lave en case på.

Nicolai
Avatar billede pgroen Nybegynder
03. juli 2006 - 11:51 #6
Hvorfor vil du kun have eet kald ?; hvis det er af performance-hensyn, vil optimizeren formentlig kunne klare skærene alligevel.
Avatar billede hgc Nybegynder
03. juli 2006 - 11:55 #7
Ellers brug et inline view, således

SELECT DECODE (VarXX, 'SET', 1, NULL) kolonne1,
        DECODE (VarXX, 'PRC', 1, NULL) kolonne2,
        ....osv
    FROM (select fx_Prod_Rap_Status (XX.DateTime, YY.Line) VarXX from XX, YY
--  WHERE ..<en eller anden join condition>
)
select
Avatar billede nicb Nybegynder
03. juli 2006 - 13:43 #8
Hvordan bruger man optimizeren, hvad gør den og hvor finder jeg den?
Nicolai
Avatar billede nicb Nybegynder
03. juli 2006 - 13:58 #9
hgc
Jeg har et problem med at få koden til at virke, jeg får fejlen at from mangler!

Nicolai
Avatar billede hgc Nybegynder
03. juli 2006 - 14:06 #10
Optimizeren er ikke "noget man finder".
Den sørger for den optimale søgevej til de data der efterspørges - kort fortalt, men ellers er det et ret omfattende emne du er inde på ......
I relation til ovenstående menes blot at Oracle formentlig selv finder ud af at det ikke er nødvendig at kalde den samme funktion 4 gange med de samme parametre. Jeg ville nok sige "muligvis" isf. "formentlig", men hvis det er en simpel funktion og som udføres relativt få gange er det ligegyldig, men hvis du vil være sikker på at den kun udføres een gang, brug da inline view som beskrevet (se selvfølgelig bort fra sidste tomme select)
Avatar billede pgroen Nybegynder
03. juli 2006 - 14:17 #11
Meget kort fortalt, så er optimizeren den del af Oracle, der beslutter hvorledes et givent statement udføres, hvilke indexes der skal bruges, i hvilken rækkefølge tabellerne skal læses, osv. Normalt behøver man ikke at bekymre sig om optimizerens virkemåde, men man KAN forsøge at hjælpe den med de såkaldte 'hints'.

Hvis du vil vide mere, kan du fx. prøve at kigge på:
http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96533/optimops.htm#721

Hvad hgc's kode angår, så select'en i sidste linie nok en tastefejl...
(han har i øvrigt ret - hans inline view vil, alt andet lige, køre hurtigere...)
Avatar billede hgc Nybegynder
03. juli 2006 - 17:08 #12
Syntaxen er

SELECT DECODE (varXX, 'MAN', '1', NULL) kolonne1,
      DECODE (varXX, 'TIR', '1', NULL) kolonne2
  FROM (SELECT TO_CHAR (SYSDATE, 'DY') varXX
          FROM DUAL
        WHERE 1 = 1);

hvor jeg har erstattet din funktion med en to_char på sysdate og din tabel med dual og where -betingelsen med noget som altid er opfyldt
Avatar billede pgroen Nybegynder
17. oktober 2007 - 12:53 #13
Halloo!

Burde du ikke lukke den her, og gi' hgc nogen point?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester