Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Auslösen der Auswahl untergeordneter Datensätze, Multiplizieren ihrer Werte und Aktualisieren des übergeordneten Datensatzes

Sie haben mehrere Probleme, aber das grundlegendste ist, dass Sie dies überhaupt nicht tun sollten. Der Versuch, einen Wert zu speichern und synchron zu halten, der immer berechnet werden kann, ist ein grundlegender Designfehler.

Nun zum Code selbst. Du hast

SELECT SUM(VALUE) into product

Das Ziel Ihres INTO muss eine deklarierte Variable sein. Sieht so aus, als ob Sie versuchen, SELECT .. INTO einen Spaltennamen.

Sie sollten lokale Variablen benennen, um zwischen ihnen und Spaltennamen zu unterscheiden. Also statt

DECLARE
value number;
amount number;
total number;

Das solltest du haben

DECLARE
v_value number;
v_amount number;
v_total number;

Umgekehrt sollten Sie über einheitliche Namenskonventionen für Ihre Tabellen und Spalten nachdenken. Für Spalten verwende und empfehle ich Namen in Form von , also ORDER_ID, PRODUCT_NAME, etc. Was ist das mit PRODUCT_ID_PRODUCT, ORDER_ID_ORDER ? Das Wiederholen des Tabellennamens in den Spaltennamen ist normalerweise nicht vorteilhaft. Obwohl es manchmal Sinn macht, weil es immer noch dem Adjektiv_Substantiv-Format folgt, wie die ID-Spalte der ORDERS-Tabelle mit dem Namen ORDER_ID. Denken Sie auch an Tabellennamen, ich mache meine Tabellennamen normalerweise zu Substantiven im Plural, weil Tabellen mehrere Instanzen einer Entität verfolgen. Wenn der Tabellenname für einen Spaltennamen sinnvoll ist (wie ORDER_ID), wäre er singulär, da eine einzelne Zeile eine einzelne Instanz der Entität verfolgt.

Schließlich ist es schwierig, eine Codierungsänderung zu empfehlen, ohne die Tabellen zu kennen. Sie haben sie nur vage beschrieben, aber besser alles auf den Tisch legen. Siehe minimal-reproducible-example