Manchmal kann es nützlich sein, eine Ansicht zu erstellen, die eine Referenz zu einer Programmvariablen enthält. Sie können zum Beispiel eine Variable innerhalb einer Prozedur definieren, die einen bestimmten Kunden kennzeichnet. Sie möchten das Kaufverhalten des Kunden abfragen, und da Sie auf ähnliche Daten mehrfach zugreifen, oder möglicherweise mehrere Aggregatfunktionen verwenden werden, empfiehlt es sich, eine Ansicht zu erstellen, die die Daten über den angegebenen Kunden enthält.
Sie können keine Ansicht erstellen, die eine Programmvariable referenziert, weil es keine Möglichkeit gibt, den Bereich einer Ansicht auf den Ihrer Prozedur zu beschränken. Sobald sie erstellt ist, kann eine Ansicht in anderen Kontexten verwendet werden. Sie können allerdings einen allgemeinen Tabellenausdruck innerhalb der Abfragen in Ihrer Prozedur verwenden. Da der Bereich eines allgemeinen Tabellenausdrucks auf die Anweisung beschränkt ist, erzeugt die Variablenreferenz keine Zweideutigkeit und ist zulässig.
Die folgende Anweisung wählt die Bruttoverkaufszahlen verschiedener Handelsvertreter in der SQL Anywhere-Beispieldatenbank aus:
SELECT GivenName || ' ' || Surname AS sales_rep_name, SalesRepresentative AS sales_rep_id, SUM( p.UnitPrice * i.Quantity ) AS total_sales FROM Employees LEFT OUTER JOIN SalesOrders AS o INNER JOIN SalesOrderItems AS I INNER JOIN Products AS p WHERE OrderDate BETWEEN '2000-01-01' AND '2001-12-31' GROUP BY SalesRepresentative, GivenName, Surname; |
Die oben stehende Abfrage ist die Basis des allgemeinen Tabellenausdrucks, der in der folgenden Prozedur erscheint: Die ID-Nummer eines Handelsvertreters und das in Frage kommende Jahr sind hereinkommende Parameter. Wie die folgende Prozedur zeigt, können Prozedurparameter und etwaige deklarierte lokale Variable innerhalb der WITH-Klausel referenziert werden.
CREATE PROCEDURE sales_rep_total ( IN rep INTEGER, IN yyyy INTEGER ) BEGIN DECLARE StartDate DATE; DECLARE EndDate DATE; SET StartDate = YMD( yyyy, 1, 1 ); SET EndDate = YMD( yyyy, 12, 31 ); WITH total_sales_by_rep ( sales_rep_name, sales_rep_id, month, order_year, total_sales ) AS ( SELECT GivenName || ' ' || Surname AS sales_rep_name, SalesRepresentative AS sales_rep_id, month( OrderDate), year( OrderDate ), SUM( p.UnitPrice * i.Quantity ) AS total_sales FROM Employees LEFT OUTER JOIN SalesOrders o INNER JOIN SalesOrderItems I INNER JOIN Products p WHERE OrderDate BETWEEN StartDate AND EndDate AND SalesRepresentative = rep GROUP BY year( OrderDate ), month( OrderDate ), GivenName, Surname, SalesRepresentative ) SELECT sales_rep_name, monthname( YMD(yyyy, month, 1) ) AS month_name, order_year, total_sales FROM total_sales_by_rep WHERE total_sales = ( SELECT MAX( total_sales) FROM total_sales_by_rep ) ORDER BY order_year ASC, month ASC; END; |
Die folgende Anweisung ruft die obige Prozedur auf.
CALL sales_rep_total( 129, 2000 ); |
Kommentieren Sie diese Seite in DocCommentXchange. Senden Sie uns Feedback über diese Seite via E-Mail. |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |