下面是包頭
CREATE OR REPLACE PACKAGE REPORTUSER.REPORT_CN_UA IS
PROCEDURE SALES_BYGROUP (
V_REPORT_DATE_DRG IN VARCHAR2,
V_SBS_NO_LOK IN VARCHAR2,
V_STORE_NO_LOK IN VARCHAR2,
"REPORT_CURSOR" OUT SYS_REFCURSOR
);
END REPORT_CN_UA;
下面是包體
CREATE OR REPLACE PACKAGE BODY REPORTUSER.REPORT_CN_UA IS
FUNCTION COMMON_FILTERS
(
V_REPORT_DATE_DRG IN VARCHAR2,
DATE_COL IN VARCHAR2,
V_SBS_NO_LOK IN VARCHAR2,
SBS_COL IN VARCHAR2,
V_STORE_NO_LOK IN VARCHAR2,
STORE_COL IN VARCHAR2
)
RETURN LONG
AS
TMPSTRSQL LONG ;
BEGIN
IF TRIM(V_REPORT_DATE_DRG) IS NOT NULL THEN
TMPSTRSQL := TMPSTRSQL || ' AND ( ' || PKG_PARSER.GETRANGESHORTDATESTR(V_REPORT_DATE_DRG, DATE_COL, DATE_COL) || ')';
END IF;
IF TRIM(V_SBS_NO_LOK) IS NOT NULL THEN
TMPSTRSQL := TMPSTRSQL || ' AND ' || SBS_COL || ' IN ' || V_SBS_NO_LOK;
END IF;
IF TRIM(V_STORE_NO_LOK) IS NOT NULL THEN
TMPSTRSQL := TMPSTRSQL || ' AND (' || SBS_COL || ',' || STORE_COL || ') IN ' || V_STORE_NO_LOK;
END IF;
RETURN TMPSTRSQL;
END COMMON_FILTERS;
PROCEDURE SALES_BYGROUP (
V_REPORT_DATE_DRG IN VARCHAR2,
V_SBS_NO_LOK IN VARCHAR2,
V_STORE_NO_LOK IN VARCHAR2,
"REPORT_CURSOR" OUT SYS_REFCURSOR
) IS
TMPSTRSQL CLOB;
ARRDATE TOKENTABLETYPE;
DATEFROM DATE;
DATETILL DATE;
DATEFROMSTR VARCHAR2(100);
DATETILLSTR VARCHAR2(100);
BEGIN
IF TRIM(V_REPORT_DATE_DRG) IS NOT NULL THEN
ARRDATE := PKG_PARSER.GETTOKEN(V_REPORT_DATE_DRG,',');
IF ARRDATE.LAST = 3 THEN
DATEFROM := TO_DATE(TRIM('''' FROM ARRDATE(2)),PKG_PARSER.SHORT_DATE_FORMATE);
DATETILL := TO_DATE(TRIM('''' FROM ARRDATE(3)),PKG_PARSER.SHORT_DATE_FORMATE);
DATEFROMSTR := ARRDATE(2);
DATETILLSTR := ARRDATE(3);
ELSE
DATEFROM := TRUNC(SYSDATE());
DATETILL := TRUNC (SYSDATE());
DATEFROMSTR := '''' || TO_CHAR(SYSDATE(), PKG_PARSER.SHORT_DATE_FORMATE) || '''';
DATETILLSTR := '''' || TO_CHAR(SYSDATE(), PKG_PARSER.SHORT_DATE_FORMATE) || '''';
END IF;
ELSE
DATEFROM := TRUNC(SYSDATE());
DATETILL := TRUNC (SYSDATE());
DATEFROMSTR := '''' || TO_CHAR(SYSDATE(), PKG_PARSER.SHORT_DATE_FORMATE) || '''';
DATETILLSTR := '''' || TO_CHAR(SYSDATE(), PKG_PARSER.SHORT_DATE_FORMATE) || '''';
END IF;
TMPSTRSQL:='
SELECT ';
IF TRIM(V_REPORT_DATE_DRG) IS NOT NULL THEN
TMPSTRSQL := TMPSTRSQL || DATEFROMSTR || ' AS START_DATE, ';
TMPSTRSQL := TMPSTRSQL || DATETILLSTR || ' AS END_DATE, ';
END IF;
TMPSTRSQL := TMPSTRSQL ||
'
INVC.SBS_NO AS PARTNER,
STO.STORE_NAME AS STORE_NAME,
STO.UDF1_VALUE AS STORE_CODE,
CASE WHEN STO.PRICE_LVL = 1 THEN ''BH'' ELSE ''FH'' END as STORE_TYPE,
STO.ADDRESS6 AS CITY,
STO.TOTAL_SURFACE AS SQM,
SUM(CASE WHEN INVC.INVC_TYPE=2 THEN ITEM.QTY * -1 ELSE ITEM.QTY END) AS UNITS,
SUM(ITEM.PRICE * ITEM.QTY * CASE WHEN INVC.INVC_TYPE=2 THEN -1 ELSE 1 END) AS SALES,
SUM(ITEM.ORIG_PRICE * ITEM.QTY * CASE WHEN INVC.INVC_TYPE=2 THEN -1 ELSE 1 END) AS ORIG_SALES,
STO.GLOB_STORE_CODE AS STORE_CODE1,
DECODE(SUBSTR(DCS_CODE,0,3),''101'',''App'',''102'',''Footware'',''104'',''Acc'') AS GROUP_TYPE
FROM INVOICE_V INVC, INVC_ITEM ITEM, STORE_V STO, INVENTORY_V INVEN
WHERE
INVC.INVC_SID=ITEM.INVC_SID
AND INVC.STORE_NO = STO.STORE_NO AND INVC.SBS_NO = STO.SBS_NO
AND INVEN.ITEM_SID=ITEM.ITEM_SID AND INVEN.SBS_NO=INVC.SBS_NO
AND INVC.HISEC_TYPE IS NULL
AND INVC.STATUS2 = 0 ';
TMPSTRSQL := TMPSTRSQL || COMMON_FILTERS(V_REPORT_DATE_DRG, 'TRUNC(INVC.CREATED_DATE)', V_SBS_NO_LOK, 'INVC.SBS_NO', V_STORE_NO_LOK, 'INVC.STORE_NO');
TMPSTRSQL := TMPSTRSQL || '
GROUP BY
INVC.SBS_NO,
STO.STORE_NAME,
STO.UDF1_VALUE,
CASE WHEN STO.PRICE_LVL = 1 THEN ''BH'' ELSE ''FH'' END,
STO.ADDRESS6,
STO.TOTAL_SURFACE,
STO.GLOB_STORE_CODE,
DECODE(SUBSTR(DCS_CODE,0,3),''101'',''App'',''102'',''Footware'',''104'',''Acc'')
ORDER BY INVC.SBS_NO, STO.STORE_NAME
';
OPEN "REPORT_CURSOR" FOR
TMPSTRSQL;
END SALES_BYGROUP;
END REPORT_CN_UA;
我該怎么呼叫我這個函式,我也試了我的呼叫,可以不行,你們能寫個這個怎么呼叫的sql陳述句么?
附上我寫的呼叫sql
DECLARE
"REPORT_CURSOR" SYS_REFCURSOR;
V_REPORT_DATE_DRG varchar2(10);
V_SBS_NO_LOK varchar2(100);
V_STORE_NO_LOK varchar2(100);
begin
V_REPORT_DATE_DRG := TO_CHAR(sysdate, 'MM/DD/YYYY');
dbms_output.put_line(V_REPORT_DATE_DRG);
V_SBS_NO_LOK := '-1';
V_STORE_NO_LOK := '0';
-- Call the procedure
REPORT_CN_UA.SALES_BYGROUP(V_REPORT_DATE_DRG,V_SBS_NO_LOK,V_STORE_NO_LOK,"REPORT_CURSOR");
if REPORT_CURSOR%isopen then
dbms_output.put_line('deptlist opened');
close REPORT_CURSOR;
end if;
end;
uj5u.com熱心網友回復:
你的思路沒啥問題,關鍵列印輸出為什么不是放在回圈里面 。你用了那個包里面的程序后,你的游標就有值了。uj5u.com熱心網友回復:
該怎么寫呢?你能不能寫下感謝你
uj5u.com熱心網友回復:
還有下面不是用isopen 你都沒有打開的 用for in loop吧 或者fetch into 到 recode 再loop 列印uj5u.com熱心網友回復:
可以附上你的陳述句么大神,我剛開始弄存盤程序 感激不盡uj5u.com熱心網友回復:
我是手機 不好弄 而且在趕路
uj5u.com熱心網友回復:
那我只有等你了,就是太感謝你了。我這邊怎么呼叫都不行,還望給我個陳述句,我試下uj5u.com熱心網友回復:
你把你的if 那個換成 for rr in 你的游標名,然后 loop dbms_output.put_putline(rr.欄位) end loopuj5u.com熱心網友回復:
我這個是從好多張表查詢該怎么寫呼叫陳述句啊,大神,幫幫我FROM INVOICE_V INVC, INVC_ITEM ITEM, STORE_V STO, INVENTORY_V INVEN
uj5u.com熱心網友回復:
大神們幫幫我uj5u.com熱心網友回復:
你把你的DECLARE改成一個prodecure,然后單步除錯看看哪里報錯了呀uj5u.com熱心網友回復:
如果我改了話就報無效sql陳述句錯轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/69672.html
標籤:高級技術
