base al largo di how to return a dynamic result set in Oracle functionOracle SQL creazione di una funzione - confondendo errori di compilazione
Sto cercando di fare una funzione che restituisce una riga con diversi conteggi da diverse tabelle. Ecco quello che ho finora:
CREATE OR REPLACE TYPE RESULT_ROW is OBJECT
(LOC_TABLE_ENTRY_KY VARCHAR2(50),
LOCATION_NAME VARCHAR2(50),
A_ASSIGN_CNT VARCHAR2(50),
B_ASSIGN_CNT VARCHAR2(50),
C_ASSIGN_CNT VARCHAR2(50),
D_ASSIGN_CNT VARCHAR2(50),
E_ASSIGN_CNT VARCHAR2(50),
F_ASSIGN_CNT VARCHAR2(50),
G_ASSIGN_CNT VARCHAR2(50),
H_ASSIGN_CNT VARCHAR2(50));
/
CREATE OR REPLACE TYPE RESULT_TABLE AS TABLE OF RESULT_ROW;
/
CREATE OR REPLACE FUNCTION LOCATION_RULE_LOOKUP(P_LOCATION_VAR IN NUMBER)
RETURN RESULT_TABLE
IS
OUT_REC RESULT_TABLE;
BEGIN
WITH LOC AS
(SELECT LOC_TABLE_ENTRY_KY,
LOCATION_NAME
FROM LOCATION_CODE
WHERE LOC_TABLE_ENTRY_KY = P_LOCATION_VAR
),
ONE AS
(SELECT COUNT(*) AS A_ASSIGN_CNT
FROM COLLECTOR_ASSIGNMENT
WHERE LOCATION_CODE = P_LOCATION_VAR
AND FUNCTION_STATE_CODE = ' '
OR FUNCTION_STATE_CODE = '***'
),
TWO AS
(SELECT COUNT(*) AS B_ASSIGN_CNT
FROM COMM_PLAN_ASSGN_RULE
WHERE LOCATION_CODE = P_LOCATION_VAR
),
THREE AS
(SELECT COUNT(*) AS C_ASSIGN_CNT
FROM INPUT_TRANS_ASGN
WHERE LOCATION_CODE = P_LOCATION_VAR
),
FOUR AS
(SELECT COUNT(*) AS D_ASSIGN_CNT
FROM RECALL_DAYS_ASSGN_RULE
WHERE LOCATION_CODE = P_LOCATION_VAR
),
FIVE AS
(SELECT COUNT(*) AS E_ASSIGN_CNT
FROM SCRIPT_VIEW_ASSIGNMENT
WHERE LOCATION_CODE = P_LOCATION_VAR
AND FUNCTION_STATE_CODE = ' '
OR FUNCTION_STATE_CODE = '***'
AND SCRIPT_TYPE = 'V'
),
SIX AS
(SELECT COUNT(*) AS F_ASSIGN_CNT
FROM SCRIPT_VIEW_ASSIGNMENT
WHERE LOCATION_CODE = P_LOCATION_VAR
AND FUNCTION_STATE_CODE = ' '
OR FUNCTION_STATE_CODE = '***'
AND SCRIPT_TYPE = 'D'
),
SEVEN AS
(SELECT COUNT(*) AS G_ASSIGN_CNT
FROM TSR_ASSGN_RULE
WHERE LOCATION_CODE = P_LOCATION_VAR
),
EIGHT AS
(SELECT COUNT(*) AS H_ASSIGN_CNT
FROM TRAN_STATE_ASSGN_RULE
WHERE LOCATION_CODE = P_LOCATION_VAR
)
SELECT * INTO OUT_REC
FROM ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, LOC;
RETURN OUT_REC;
END LOCATION_RULE_LOOKUP;
Ma non importa quello che faccio per rendere questo sembrare esempi di funzioni esistenti, sia qui che su altri siti, non accetta nulla all'interno del blocco BEGIN. L'SQL all'interno del blocco BEGIN funziona; Posso eseguire tutti quelli CON COME SELEZIONA ecc. E mi darà una riga come risultato con i conteggi che sto cercando. Ma questa funzione NON verrà compilata. A seconda di dove metto uno spazio o un punto e virgola, gli errori cambiano. Errori attuali:
Error(7,3): PL/SQL: SQL Statement ignored
Error(62,3): PL/SQL: ORA-00947: not enough values
Aiuto? D:
Heh, questo è quello che ottengo per l'utilizzo di qualcosa che non capisco. Mi dispiace disturbarla. Quei problemi erano esattamente ciò - funziona ora. :) –
Non c'è bisogno di scusarsi. Sono felice che funzioni per te. :-) – ruakh