Wie können wir Ausgabeparametergröße in der gespeicherten Prozedur definieren?Wie können wir Ausgabeparametergröße in der gespeicherten Prozedur definieren?
Antwort
Sie können nicht. Natürlich sind Sie in Kontrolle, wie viel Daten Sie in den OUT-Parameter in der gespeicherten Prozedur eingeben. Wenn Sie möchten, können Sie eine große lokale Variable erstellen, um die Daten zu speichern, und dann den Wert dieser Variablen dem OUT-Parameter zuweisen.
Das aufrufende Programm bestimmt die Größe der Variablen, die den Parameter OUT empfängt.
Sie einen Subtyp in einem Paket-Header verwenden könnte, und geben Sie, dass im Körper prüfen ...
CREATE OR REPLACE PACKAGE my_test
AS
SUBTYPE my_out IS VARCHAR2(10);
PROCEDURE do_something(pv_variable IN OUT my_out);
END;
/
CREATE OR REPLACE PACKAGE BODY my_test
AS
PROCEDURE do_something(pv_variable IN OUT my_out)
IS
lv_variable my_out;
BEGIN
-- Work on a local copy of the variable in question
lv_variable := 'abcdefghijklmnopqrstuvwxyz';
pv_variable := lv_variable;
END do_something;
END;
/
Dann, wenn Sie laufen diese
DECLARE
lv_variable VARCHAR2(30);
BEGIN
my_test.do_something(lv_variable);
DBMS_OUTPUT.PUT_LINE('['||lv_variable||']');
END;
/
Sie würden den Fehler
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
Scheint, gegen den Geist der Verwendung eines Out-Parameters zu gehen, aber nach Tonys Kommentar war dies das einzige, was ich verdünnen konnte k von, um Daten innerhalb des aufgerufenen Codes zu steuern.
Hier ist ein einfaches Paket, das erklärt und verwendet einen Subtyp:
SQL> create or replace package my_pkg as
2 subtype limited_string is varchar2(10);
3 procedure pad_string (p_in_str varchar
4 , p_length number
5 , p_out_str out limited_string);
6 end my_pkg;
7/
Package created.
SQL> create or replace package body my_pkg as
2 procedure pad_string
3 (p_in_str varchar
4 , p_length number
5 , p_out_str out limited_string)
6 as
7 begin
8 p_out_str := rpad(p_in_str, p_length, 'A');
9 end pad_string;
10 end my_pkg;
11/
Package body created.
SQL>
Wenn wir jedoch PAD_STRING() so nennen, dass die Ausgabezeichenfolge der Präzision Subtyp des übersteigt es immer noch erfolgreich abgeschlossen wurde. Mühe!
Das ist ärgerlich, aber es ist die Art wie PL/SQL funktioniert, also müssen wir damit leben.
Der Weg, um die Situation zu lösen, ist im Grunde zu gelten DBC principles und validieren Sie unsere Parameter.
SQL> create or replace package body my_pkg as
2 procedure pad_string
3 (p_in_str varchar
4 , p_length number
5 , p_out_str out limited_string)
6 as
7 begin
8 if length(p_in_str) + p_length > 10 then
9 raise_application_error(
10 -20000
11 , 'Returned string cannot be longer than 10 characters!');
12 end if;
13 p_out_str := rpad(p_in_str, p_length, 'A');
14 end pad_string;
15 end my_pkg;
16/
Package body created.
SQL>
SQL> exec my_pkg.pad_string('PAD THIS!', 12, :out_str)
BEGIN my_pkg.pad_string('PAD THIS!', 12, :out_str); END;
*
ERROR at line 1:
ORA-20000: Returned string cannot be longer than 10 characters!
ORA-06512: at "APC.MY_PKG", line 9
ORA-06512: at line 1
SQL>
Oder können wir Geschäftsregeln gegen die Ausgabe wie folgt behaupten: So können wir Geschäftsregeln gegen den Eingängen wie diese behaupten
SQL> create or replace package body my_pkg as
2 procedure pad_string
3 (p_in_str varchar
4 , p_length number
5 , p_out_str out limited_string)
6 as
7 l_str limited_string;
8 begin
9 l_str := rpad(p_in_str, p_length, 'A');
10 p_out_str := l_str;
11 end pad_string;
12 end my_pkg;
13/
Package body created.
SQL>
SQL> exec my_pkg.pad_string('PAD THIS!', 12, :out_str)
BEGIN my_pkg.pad_string('PAD THIS!', 12, :out_str); END;
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "APC.MY_PKG", line 9
ORA-06512: at line 1
SQL>
In den meisten Szenarien sollten wir beides tun. Dies ist die höfliche Art, Schnittstellen zu erstellen, da dies bedeutet, dass andere Routinen unsere Prozeduren mit der Gewissheit aufrufen können, dass sie die Werte zurückgeben, die sie sagen.
- 1. können wir verschiedene Abfragen in einer gespeicherten Prozedur gleichzeitig ausführen?
- 2. Aufrufen der gespeicherten Prozedur
- 3. Abbrechen der Aysnchronous gespeicherten Prozedur
- 4. Suchen einer gespeicherten Prozedur
- 5. Können wir statische Funktionen in tcOO definieren?
- 6. Können wir Autoinkrementattribute in Kerndaten definieren?
- 7. Partielle Vorbereitung der gespeicherten Prozedur
- 8. Zählen der Ergebnisse der gespeicherten Prozedur
- 9. Wie lautet die Syntax zum Definieren einer Oracle-Prozedur in einer anderen gespeicherten Prozedur?
- 10. Wie wir mysql_affected_rows() in gespeicherte Prozedur verwenden können
- 11. Wie Debuggen einer gespeicherten Prozedur in Toad?
- 12. Können wir Enum innerhalb einer Funktion definieren?
- 13. eine Spalte in der gespeicherten Prozedur hinzufügen
- 14. Ausführen einer gespeicherten Prozedur innerhalb einer gespeicherten Prozedur
- 15. Wie unterdrücke ich die Ergebnisse einer gespeicherten Prozedur aus einer gespeicherten Prozedur?
- 16. MS SQL: Unterdrücken Rückgabewert der gespeicherten Prozedur aufgerufen in gespeicherten Prozedur
- 17. Entity Framework - Rückgabewert der gespeicherten Prozedur
- 18. SubSonic 3.0.0.3 Aufruf der gespeicherten Prozedur Ausgabe
- 19. Anzeige Parameterwert Liste der gespeicherten Prozedur
- 20. Filtern der Ergebnismenge einer gespeicherten Prozedur
- 21. Übergeben der gespeicherten Prozedur an sp_send_dbmail
- 22. Wie verwenden Sie eingefügte \ gelöschte Tabelle in der gespeicherten Prozedur?
- 23. Wie verwende ich den Fall in der gespeicherten Prozedur?
- 24. Wie generiert man eine neue Guid in der gespeicherten Prozedur?
- 25. MySQL: Wie man Tabelle dynamisch in der gespeicherten Prozedur erstellt?
- 26. Unit Test zum Aufrufen der gespeicherten Prozedur
- 27. Fehler beim Aufrufen der gespeicherten DB2-Prozedur
- 28. Wie wird der vollständige Code der gespeicherten Prozedur angezeigt?
- 29. Ausführen der gespeicherten Prozedur verursacht Fehler
- 30. Masseneinsatz unter Verwendung der gespeicherten Prozedur
Das dokumentiert die Absicht, aber es gelingt nicht, die Größe des zurückgegebenen Werts zu beschränken. Die Prozedur kann über pv_variable eine Zeichenfolge beliebiger Größe zurückgeben. –
Ich habe immer Typ/Länge in meinem Code überprüft, so dass nie ein Out-Parameter (oder Funktionsrückgabe) keine Beschränkung auf die Rückgabegröße bemerkt. Guter Platz Tony. –