Wer kann ein Verfahren erstellen
Die CREATE PROCEDURE
-Anweisung kann ausgeführt werden durch:
-
Benutzer mit dem Privileg
CREATE PROCEDURE
Der Benutzer, der die Anweisung CREATE PROCEDURE
ausführt, wird Eigentümer der Tabelle.
Die CREATE PROCEDURE
-Anweisung kann ausgeführt werden durch:
Benutzer mit dem Privileg CREATE PROCEDURE
Der Benutzer, der die Anweisung CREATE PROCEDURE
ausführt, wird Eigentümer der Tabelle.
Erstellen einer gespeicherten Prozedur, die einen Datensatz in die BREED
-Tabelle einfügt und den Code des eingefügten Datensatzes zurückgibt:
CREATE PROCEDURE ADD_BREED (
NAME D_BREEDNAME, /* Domain attributes are inherited */
NAME_EN TYPE OF D_BREEDNAME, /* Only the domain type is inherited */
SHORTNAME TYPE OF COLUMN BREED.SHORTNAME,
/* The table column type is inherited */
REMARK VARCHAR(120) CHARACTER SET WIN1251 COLLATE PXW_CYRL,
CODE_ANIMAL INT NOT NULL DEFAULT 1
)
RETURNS (
CODE_BREED INT
)
AS
BEGIN
INSERT INTO BREED (
CODE_ANIMAL, NAME, NAME_EN, SHORTNAME, REMARK)
VALUES (
:CODE_ANIMAL, :NAME, :NAME_EN, :SHORTNAME, :REMARK)
RETURNING CODE_BREED INTO CODE_BREED;
END
Erstellen einer auswählbaren gespeicherten Prozedur, die Daten für Adressetiketten generiert (aus employee.fdb
):
CREATE PROCEDURE mail_label (cust_no INTEGER)
RETURNS (line1 CHAR(40), line2 CHAR(40), line3 CHAR(40),
line4 CHAR(40), line5 CHAR(40), line6 CHAR(40))
AS
DECLARE VARIABLE customer VARCHAR(25);
DECLARE VARIABLE first_name VARCHAR(15);
DECLARE VARIABLE last_name VARCHAR(20);
DECLARE VARIABLE addr1 VARCHAR(30);
DECLARE VARIABLE addr2 VARCHAR(30);
DECLARE VARIABLE city VARCHAR(25);
DECLARE VARIABLE state VARCHAR(15);
DECLARE VARIABLE country VARCHAR(15);
DECLARE VARIABLE postcode VARCHAR(12);
DECLARE VARIABLE cnt INTEGER;
BEGIN
line1 = '';
line2 = '';
line3 = '';
line4 = '';
line5 = '';
line6 = '';
SELECT customer, contact_first, contact_last, address_line1,
address_line2, city, state_province, country, postal_code
FROM CUSTOMER
WHERE cust_no = :cust_no
INTO :customer, :first_name, :last_name, :addr1, :addr2,
:city, :state, :country, :postcode;
IF (customer IS NOT NULL) THEN
line1 = customer;
IF (first_name IS NOT NULL) THEN
line2 = first_name || ' ' || last_name;
ELSE
line2 = last_name;
IF (addr1 IS NOT NULL) THEN
line3 = addr1;
IF (addr2 IS NOT NULL) THEN
line4 = addr2;
IF (country = 'USA') THEN
BEGIN
IF (city IS NOT NULL) THEN
line5 = city || ', ' || state || ' ' || postcode;
ELSE
line5 = state || ' ' || postcode;
END
ELSE
BEGIN
IF (city IS NOT NULL) THEN
line5 = city || ', ' || state;
ELSE
line5 = state;
line6 = country || ' ' || postcode;
END
SUSPEND; -- die Anweisung, die eine Ausgabezeile an den Puffer sendet
-- und die Prozedur "selektierbar" macht
END
With DEFINER
set for procedure p
, user US
needs only the EXECUTE
privilege on p
.If it were set for INVOKER
, either the user or the procedure would also need the INSERT
privilege on table t
.
set term ^;
create procedure p (i integer) SQL SECURITY DEFINER
as
begin
insert into t values (:i);
end^
set term ;^
grant execute on procedure p to user us;
commit;
connect 'localhost:/tmp/17.fdb' user us password 'pas';
execute procedure p(1);
ALTER PROCEDURE
Ändern einer vorhandenen gespeicherten Prozedur
DSQL, ESQL
ALTER PROCEDURE procname [ ( [ <in_params> ] ) ]
[RETURNS (<out_params>)]
<module-body>
!! Vgl. auch die Syntax CREATE PROCEDURE
für weitere Regeln !!
Die ALTER PROCEDURE
-Anweisung ermöglicht die folgenden Änderungen an einer Stored-Procedure-Definition:
der Satz und die Eigenschaften der Eingabe- und Ausgabeparameter
lokale Variablen
Code im Hauptteil der gespeicherten Prozedur
Nachdem ALTER PROCEDURE
ausgeführt wurde, bleiben bestehende Privilegien intakt und Abhängigkeiten werden nicht beeinflusst.
Wenn Sie eine Prozedur ändern, ohne die SQL SECURITY
-Klausel anzugeben, wird die SQL-Sicherheitseigenschaft entfernt, wenn sie derzeit für diese Prozedur festgelegt ist.Dies bedeutet, dass das Verhalten auf den Datenbankstandard zurückgesetzt wird.
Caution
|
Achten Sie darauf, die Anzahl und den Typ der Eingabe- und Ausgabeparameter in gespeicherten Prozeduren zu ändern.Vorhandener Anwendungscode und Prozeduren und Trigger, die ihn aufrufen, könnten ungültig werden, da die neue Beschreibung der Parameter nicht mit dem alten Aufrufformat kompatibel ist.Informationen zur Behebung einer solchen Situation finden Sie im Artikel Das |
Die Anweisung ALTER PROCEDURE
kann ausgeführt werden durch:
Der Besitzer der gespeicherten Prozedur
Benutzer mit der Berechtigung ALTER ANY PROCEDURE
ALTER PROCEDURE
-BeispielGET_EMP_PROJ
.ALTER PROCEDURE GET_EMP_PROJ (
EMP_NO SMALLINT)
RETURNS (
PROJ_ID VARCHAR(20))
AS
BEGIN
FOR SELECT
PROJ_ID
FROM
EMPLOYEE_PROJECT
WHERE
EMP_NO = :emp_no
INTO :proj_id
DO
SUSPEND;
END
CREATE OR ALTER PROCEDURE
Erstellen einer neuen gespeicherten Prozedur oder Ändern einer vorhandenen Prozedur
DSQL
CREATE OR ALTER PROCEDURE procname [ ( [ <in_params> ] ) ]
[RETURNS (<out_params>)]
{<psql_procedure> | <external-module-body>}
!! Vgl. auch die Syntax CREATE PROCEDURE
für weitere Regeln !!
Die Anweisung "CREATE OR ALTER PROCEDURE" erstellt eine neue gespeicherte Prozedur oder ändert eine vorhandene.Wenn die gespeicherte Prozedur nicht existiert, wird sie durch transparentes Aufrufen einer CREATE PROCEDURE
-Anweisung erstellt.Wenn die Prozedur bereits existiert, wird sie geändert und kompiliert, ohne ihre bestehenden Privilegien und Abhängigkeiten zu beeinträchtigen.
CREATE OR ALTER PROCEDURE
-BeispielGET_EMP_PROJ
.CREATE OR ALTER PROCEDURE GET_EMP_PROJ (
EMP_NO SMALLINT)
RETURNS (
PROJ_ID VARCHAR(20))
AS
BEGIN
FOR SELECT
PROJ_ID
FROM
EMPLOYEE_PROJECT
WHERE
EMP_NO = :emp_no
INTO :proj_id
DO
SUSPEND;
END
DROP PROCEDURE
Löschen einer gespeicherten Prozedur
DSQL, ESQL
DROP PROCEDURE procname
Parameter | Beschreibung |
---|---|
procname |
Name einer vorhandenen gespeicherten Prozedur |
Die Anweisung DROP PROCEDURE
löscht eine vorhandene gespeicherte Prozedur.Wenn die gespeicherte Prozedur Abhängigkeiten aufweist, schlägt der Versuch, sie zu löschen, fehl und der entsprechende Fehler wird ausgegeben.
Die Anweisung ALTER PROCEDURE
kann ausgeführt werden durch:
Der Besitzer der gespeicherten Prozedur
Benutzer mit dem Privileg DROP ANY PROCEDURE
DROP PROCEDURE
-BeispielGET_EMP_PROJ
.DROP PROCEDURE GET_EMP_PROJ;
RECREATE PROCEDURE
Erstellen einer neuen gespeicherten Prozedur oder Neuerstellen einer vorhandenen Prozedur
DSQL
RECREATE PROCEDURE procname [ ( [ <in_params> ] ) ]
[RETURNS (<out_params>)]
{<psql_procedure> | <external-module-body>}
!! Vgl. auch die Syntax CREATE PROCEDURE
für weitere Regeln !!
Die Anweisung 'RECREATE PROCEDURE' erstellt eine neue gespeicherte Prozedur oder erstellt eine vorhandene neu.Wenn es bereits eine Prozedur mit diesem Namen gibt, versucht die Engine, diese zu löschen und eine neue zu erstellen.Das Neuerstellen einer vorhandenen Prozedur schlägt bei der COMMIT
-Anforderung fehl, wenn die Prozedur Abhängigkeiten hat.
Warning
|
Beachten Sie, dass Abhängigkeitsfehler erst in der |
Nachdem eine Prozedur erfolgreich neu erstellt wurde, werden die Berechtigungen zum Ausführen der gespeicherten Prozedur und die Berechtigungen der gespeicherten Prozedur selbst gelöscht.
RECREATE PROCEDURE
-BeispielGET_EMP_PROJ
oder Neuerstellen der vorhandenen gespeicherten Prozedur GET_EMP_PROJ
.RECREATE PROCEDURE GET_EMP_PROJ (
EMP_NO SMALLINT)
RETURNS (
PROJ_ID VARCHAR(20))
AS
BEGIN
FOR SELECT
PROJ_ID
FROM
EMPLOYEE_PROJECT
WHERE
EMP_NO = :emp_no
INTO :proj_id
DO
SUSPEND;
END