Announcement

Collapse
No announcement yet.

SQL Abfragen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQL Abfragen

    hallo zusammen

    ich brauche hilfe für zwei abfragen in sql. ich habe ein system das auf einer oracle db basiert und kann in diesem programm sql abfragen vermerken:

    1. ich habe einträge apfel, birne, banane. zu jedem dieser frucht kann ja eingetragen werden. ich möchte eine sql formel hinterlegen, die verhindert, dass bei allen früchten ja eingetragen werden kann. es sollte also nur möglich sein entweder bei apfel oder bei birne oder bei banane ein ja einzutragen.
    sobald bei einer frucht ein ja gesetzt wurde, kann bei keiner anderen frucht mehr ein eintrag gemacht werden!
    formel: wenn in apfel oder in birne oder in banana ein ja gesetzt, dann sperr die anderen zwei felder.....

    2. ich habe einträge: apfel, birne, banane..... am schluss muss ich in meinem programm bestätigen, dass alles komplett ist. bevor ich aber bestätigen kann, dass alle komplett ist, soll mittels formel überprüft werden, ob bei einem dieser felder (apfel, oder birne, oder banana) mit ja versehen worden ist.
    falls bei einem dieser früchte ein ja gesetzt wurde kann die bestätigung für komplett gemacht werden.
    formel: überprüfe ob bei apfel oder bei birne oder bei banane ein ja gesetzt ist. erst dann kann die bestätigung gemacht werden.

    ich hoffe, es ist verständlich was ich für eine formel benötige. apfel, birne, banane sind felder wo eben noch hinterlegt werden kann "ja". die bestätigung ist ebenfalss ein feld dass anschliessend mit dem eintrage "komplett" gefüllt werden kann.

  • #2
    Soweit ich das Überblicke solltest du das am Besten dort machen wo du dein "Programm" entwickelst, also in C, Delphi, VB, was-weiß-ich. Aber solange du die Terminologie (Abfrage, Formel, Programm, Feld, Bestätigung) sinnfrei (und scheinbar beliebig) verwendest, wird dir keiner wirklich helfen können.

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Hi,

      der Ansatz einer "Formel" funktioniert nur solange eine ganz gravierende Rahmenbedingung erfüllt ist: Es ist nut eine Singleuserumgebung. Sprich es ändern nie mehrere user gleichzeit auf dieser Tabelle. Ist das nicht so (davon geh ich aus) hilft dir die beste Formel nichts, denn Du siehst überhaupt nicht ob eine andere Session da vielleicht was ändert solange diese die Transaktion nicht committet hat.

      Daher ist ein Ansatz außerhalb der DB nicht realisierbar.
      Die einzige Möglichkeit die Du hast, ist mit Datenbanklocks zu arbeiten.
      Bedeutet, Du machst Du erst einen SELECT ... FROM tabelle FOR UPDATE und sperrst somit die Tabelle für weitere Änderungen.

      Dann gehst Du die 4 Einträge durch ob evtl. schon ein Eintrag auf ja gesetzt wurde (bei 4 Einträgen kann man durchiterieren, bei hundert oder tausenden würde ich ein weiteres SQL mit einer entsprechender WHERE Bedigung absetzen).
      Ist keines deiner Felder auf ja gesetzt, dann kannst deinen UPDATE machen und die Änderung per COMMIT festschreiben. Andernfalls brichst Du die Operation mit ROLLBACK ab.

      Dim
      Zitat Tom Kyte:
      I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

      Comment


      • #4
        besten dank dimitri

        also 1. durch das system ist abgesichert, dass jeweils nur ein user einen gewissen datensatz bearbeiten kann. also dies muss nicht zuerst mit sql sichergestellt werden.

        es geht mehr darum, die abfrage zu machen ob irgendwo ein ja gesetzt wurde und vorausgehend festzulegen, dass nur ein einziges ja gesetzt werden kann....


        select decode(apfel, birne, banane, JA, lock field=NULL....

        also wenn in einem feld JA eingetragen ist dann sperr die anderen felder damit dort nichts eingetragen werden kann...????

        und das zweite eben überprüfe ob bei den drei feldern eines mit JA gefüllt wurde und erst dann kann das feld KOMPLETT bestätigt werden...

        Comment


        • #5
          also 1. durch das system ist abgesichert, dass jeweils nur ein user einen gewissen datensatz bearbeiten kann. also dies muss nicht zuerst mit sql sichergestellt werden.
          Seufz. Ja klar. Warum etwas nutzen, dass die Datenbank bereitstellt, wenn man es auch selbst nachprogrammieren kann.

          Ich fürchte, Du hast auch einen Denkfehler was die JA/NEIN Sache betrifft. So etwas sollte mit Constraints gelöst werden, dann kannst dir die ganze Rumprüferei sparen.

          Leg eine weitere Tabelle an, die in etwa so aussieht:
          Code:
          create table status
          (id number check( id=0) primary key,
           tabelle_id number references deine_tabelle);
          Den Tabellennamen musst noch entsprechend anpassen, außerdem braucht die Tabelle in der ursprünglich das Ja eingetragen werden sollte auf jeden Fall einen Primary Key.

          Die Anwendung ist jetzt ganz einfach. Wenn für einen Eintrag ein JA gesetzt werden soll, dann machst einen entsprechenden Eintrag in der Tabelle Status und vermerkst dort den PK. Das Feld ID der Tabelle Status kann nur den Wert 1 annehmen und ist außerdem unique, damit hast auch schon sichergestellt, dass es nur einen einzigen Ja Eintrag geben kann.

          Damit kannst dir im übrigen auch das ganze locking sparen (sowohl auf Applikationsebene als auch auf DB Ebene). Du musst nur den ORA-00001 abfangen und in der AW entsprechend darauf reagieren
          Fertig.

          Dim
          Zitat Tom Kyte:
          I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

          Comment

          Working...
          X