【发布时间】:2018-10-31 18:03:40
【问题描述】:
我需要为查询提取不同格式的源名称列表。我编写了一个函数来执行此操作,它返回我想要的数据,但是,因为它截断并写入一个表,它不能在 Oracle 的查询中使用。所以我对如何在查询中进行这项工作感到困惑。这是代码。
FUNCTION GET_POD_SOURCE_FROM_APP_NO
(I_APPL_ID_SEQ IN WRD_APPLICATIONS.APPL_ID_SEQ%TYPE,
I_DELIMITER IN VARCHAR2 DEFAULT ';')
RETURN VARCHAR2
IS
CURSOR C1 IS
SELECT DISTINCT SOUR.SOUR_ID_SEQ,
SRNM.SRNM_NM,
SOUR.FORK_NM,
DECODE(POD.UNNAMED_TRIBUTARY,
'N',
NULL,
'Y',
'UNNAMED TRIBUTARY') POD_UT,
MRTP.DESCR POD_MINORTYPE,
DECODE(POD.MAJOR_TYPE,
'S',
'SURFACE WATER',
'G',
'GROUNDWATER',
NULL,
NULL) POD_MAJORTYPE
FROM WRD_SOURCES SOUR,
WRD_SOURCE_NAMES SRNM,
WRD_POINT_OF_DIVERSIONS POD,
WRD_MINOR_TYPES MRTP,
WRD_VERSION_APPLICATION_XREFS VAX
WHERE SOUR.SOUR_ID_SEQ = POD.SOUR_ID_SEQ
AND SOUR.SRNM_ID_SEQ = SRNM.SRNM_ID_SEQ
AND POD.MRTP_CD = MRTP.MRTP_CD(+)
AND POD.WRGT_ID_SEQ = VAX.WRGT_ID_SEQ
AND POD.VERS_ID_SEQ = VAX.VERS_ID_SEQ
AND VAX.APPL_ID_SEQ = I_APPL_ID_SEQ;
CURSOR C2 IS
SELECT DISTINCT TS.SOURCE_FULL
FROM WRD.TEMP_SOURCE TS
ORDER BY TS.SOURCE_FULL;
C1_R C1%ROWTYPE;
C2_R C2%ROWTYPE;
ROW_CNT PLS_INTEGER := 0;
RTN_VAL VARCHAR2(4000);
SRC_NAME VARCHAR2(400);
BEGIN
EXECUTE IMMEDIATE 'TRUNCATE TABLE TEMP_SOURCE';
FOR C1_R IN C1 LOOP
IF C1_R.POD_UT IS NOT NULL THEN
SRC_NAME := C1_R.POD_UT || ' OF ';
END IF;
SRC_NAME := SRC_NAME || C1_R.SRNM_NM;
IF C1_R.FORK_NM IS NOT NULL THEN
SRC_NAME := SRC_NAME ||', '|| C1_R.FORK_NM;
END IF;
IF C1_R.POD_MINORTYPE IS NOT NULL THEN
SRC_NAME := C1_R.POD_MINORTYPE || ', ' || SRC_NAME;
END IF;
EXECUTE IMMEDIATE 'INSERT INTO WRD.TEMP_SOURCE VALUES (SRC_NAME)';
EXECUTE IMMEDIATE 'COMMIT';
SRC_NAME := '';
END LOOP;
FOR C2_R IN C2 LOOP
ROW_CNT := ROW_CNT + 1;
IF (ROW_CNT < 2) THEN
RTN_VAL := C2_R.SOURCE_FULL;
ELSE
RTN_VAL := SUBSTR(RTN_VAL, 1, 3600) || I_DELIMITER || ' ' || C2_R.SOURCE_FULL;
END IF;
END LOOP;
RETURN(TRIM(RTN_VAL));
END GET_POD_SOURCE_FROM_APP_NO;
谢谢。
【问题讨论】:
-
不要尝试在查询中运行,在 PL/SQL 中调用它。- 有几种方法可以显示 RTN_VAL,具体取决于您将如何使用此过程。跨度>
-
虽然实际的问题是您使用该 TEMP_SOURCE 表。只需编写一些简单的旧 SQL 即可完成此操作
-
它在基于查询的 SSRS 报告中使用,并且应用程序编号来自该查询,因为它正在处理。我为大多数查询字段使用了一个视图,但该视图再次基于一个查询,一个非常大的查询,其中包含很多选择。