Limites liées aux UDF SQL¶
Cette rubrique décrit les limitations en vigueur pour les gestionnaires écrits en SQL.
Les contraintes de type d’argument et de renvoi sont parfois ignorées¶
Certaines caractéristiques de type déclarées pour un argument ou une valeur de retour seront ignorées lors de l’appel de l’UDF. Dans ces cas, la valeur reçue peut être utilisée telle quelle, qu’elle soit ou non conforme aux contraintes spécifiées dans la déclaration.
Les éléments suivants sont ignorés pour les UDFs dont la logique est écrite en SQL :
Précision et échelle pour les arguments et les valeurs de retour de type NUMBER
Longueur des arguments et des valeurs de retour de type VARCHAR
Exemple¶
Le code de l’exemple suivant déclare que l’argument arg1
et la valeur de retour doivent être un VARCHAR d’une longueur maximale d’un caractère. Cependant, l’appel à cette fonction avec un arg1
dont la valeur est supérieure à un caractère aboutira comme si la contrainte n’était pas spécifiée.
CREATE OR REPLACE FUNCTION tf (arg1 VARCHAR(1))
RETURNS VARCHAR(1)
LANGUAGE SQL AS 'SHA2(a)';
Les instructions SQL dynamiques ne sont pas prises en charge en cas de référence à des objets de base de données¶
La référence à des objets de base de données à l’aide d’instructions SQL dynamiques produira une erreur qui comprendra un texte tel que le suivant :
Compilation of SQL UDF failed: SQL compilation error: syntax error... unexpected '<variable_name>'
Si vous devez construire des instructions SQL dynamiques qui utilisent différents objets de base de données, envisagez plutôt d’écrire une procédure stockée. Vous pouvez écrire des procédures stockées dans l’un des langages suivants :
Exemple¶
Le code de l’exemple suivant échouera, parce qu’il utilise la fonction IDENTIFIER pour faire référence à une table dont le nom est spécifié dynamiquement via la variable table_name_parameter
.
CREATE OR REPLACE FUNCTION profit2(table_name_parameter VARCHAR)
RETURNS NUMERIC(11, 2)
AS
$$
SELECT SUM((retail_price - wholesale_price) * number_sold)
FROM IDENTIFIER(table_name_parameter)
$$
;