The overall goal of what I am trying to do here is execute an Oracle SQL Script from as asp.net (vb.net) web application that has SQL*Plus commands in it that queries the data and drops the results to a text file and then display the text file to the end user of the web application. I am running into a problem attempting to execute the.sql file in my visual studio code it tells me that it is not a valid SQL statement. Of course that makes sense because there is more in the.sql file than a sql statement.
I am using .NET version 4.6.1 in my Visual Studio project and I am calling an Oracle 11 database.
Here is the code that I am trying to execute. When it gets to the line where it is attempting to execute the script it throws the following error:
ERROR: Oracle.OracleException: 'ORA-00900: invalid SQL statement'
Here is the VB.NET code:
Dim OracleConnection As OracleConnection = New OracleConnection()
OracleConnection.ConnectionString = Settings.GetOracleConnectionString
OracleConnection.Open()
Dim script As String = File.ReadAllText("C:\OracleScripts\p_sum.sql")
Dim command As OracleCommand = OracleConnection.CreateCommand()
command.CommandText = script
command.ExecuteNonQuery() << Errors on this line
The.sql file makes a few calls to Oracle and then exports (spools) the results to a.txt file. Once the.sql script is executed I would then display the.txt file that is created in the browser.
I have provided a copy of the.sql file below:
SPOOL data/p_sum.txt
PROMPT REPORT P_SUM.SQL Rev.04 (MIXER=&&MIXER) (CMPD=&&CMPD) (START=&&START) (END=&&END)
SET VERIFY OFF
SET LINESIZE 130
CLEAR BREAKS
CLEAR COMPUTES
COLUMN SHIFT_DT FORMAT A6 HEADING Shift|Date
COLUMN SHIFT_NUM FORMAT B9 HEADING Sh|#
COLUMN MIXER_NUM FORMAT B99 HEADING Mix|Num
COLUMN RUN_START_DT FORMAT A12 HEADING Shift|Start
COLUMN COMPOUND FORMAT A11 HEADING |Compound
COLUMN BAG_NAME FORMAT A11 HEADING 'Bag Name'
COLUMN BAG_MIXER_NUM FORMAT B99 HEADING Bag|Usr
COLUMN BATCH_CNT FORMAT B99,999 HEADING Good|Cnt
COLUMN ERROR_CNT FORMAT B999 HEADING Bad|Cnt
COLUMN EDIT_CNT FORMAT B999 HEADING Edt|Cnt
COLUMN WT_PROD FORMAT B999,999 HEADING Lbs/Kg|Produced
COLUMN TCHARGE FORMAT B9999.9 HEADING Cycle|Min
COLUMN TDELAY FORMAT B9999.9 HEADING Delay|Min
COLUMN TCHANGE FORMAT B9999.9 HEADING Change|Min
COLUMN TNOTSCHED FORMAT B9999.9 HEADING Unschd|Min
COLUMN RUN FORMAT B99,999 HEADING Run|Min
COLUMN Avg_CHARGE FORMAT B9.99 HEADING Cycle|Avg
COLUMN pct_up FORMAT B999.9 HEADING '% Up|Time'
BREAK ON SHIFT_DT SKIP 1
CLEAR &&CLAUSE1
SELECT TO_CHAR(SHIFT_DT,' MM/DD') SHIFT_DT,
R.SHIFT_NUM,
TO_CHAR(MIN(R.RUN_START_DT),' MM/DD HH24:MI') RUN_START_DT,
'*SHIFT' COMPOUND,
'TOTAL ' BAG_NAME,
SUM(R.BATCH_CNT)-NVL(SUM(R.ERROR_CNT),0) BATCH_CNT,
SUM(R.ERROR_CNT) ERROR_CNT,
SUM(EDIT_CNT) EDIT_CNT,
SUM(R.WT_PROD) WT_PROD,
SUM(R.TCHARGE) TCHARGE,
SUM(R.TDELAY) TDELAY,
SUM(R.TCHANGE) TCHANGE,
SUM(R.TNOTSCHED) TNOTSCHED,
NVL(SUM(R.TCHARGE),0)+NVL(SUM(R.TDELAY),0)+NVL(SUM(R.TCHANGE),0)+NVL(SUM(R.TNOTSCHED),0) RUN,
DECODE(SUM(R.BATCH_CNT)-SUM(R.ERROR_CNT),0,0,SUM(R.TCHARGE)/(SUM(R.BATCH_CNT)-SUM(R.ERROR_CNT))) AVG_CHARGE,
SUM(R.TCHARGE)*100/(NVL(SUM(R.TCHARGE),0)+NVL(SUM(R.TDELAY),0)+NVL(SUM(R.TCHANGE),0)) PCT_UP
FROM MIXER.RUN_SUMM R, MIXER.SPEC S
WHERE R.SPEC_NUM=S.SPEC_NUM
AND R.MIXER_NUM IN(&&MIXER)
AND R.MIXER_NUM >=80
AND SHIFT_DT BETWEEN TO_DATE('&&START','MM/DD/RR') AND TO_DATE('&&END','MM/DD/RR')
GROUP BY R.SHIFT_DT, R.SHIFT_NUM
UNION
SELECT TO_CHAR(R.SHIFT_DT,' MM/DD') SHIFT_DT,
0 SHIFT_NUM,
'ALL SHIFTS' RUN_START_DT,
'**DAILY' COMPOUND,
'TOTAL' BAG_NAME,
SUM(R.BATCH_CNT)-NVL(SUM(R.ERROR_CNT),0) BATCH_CNT,
SUM(R.ERROR_CNT) ERROR_CNT,
SUM(EDIT_CNT) EDIT_CNT,
SUM(R.WT_PROD) WT_PROD,
SUM(R.TCHARGE) TCHARGE,
SUM(R.TDELAY) TDELAY,
SUM(R.TCHANGE) TCHANGE,
SUM(R.TNOTSCHED) TNOTSCHED,
NVL(SUM(R.TCHARGE),0)+NVL(SUM(R.TDELAY),0)+NVL(SUM(R.TCHANGE),0)+NVL(SUM(R.TNOTSCHED),0) RUN,
DECODE(SUM(R.BATCH_CNT)-SUM(R.ERROR_CNT),0,0,SUM(R.TCHARGE)/(SUM(R.BATCH_CNT)-SUM(R.ERROR_CNT))) AVG_CHARGE,
SUM(R.TCHARGE)*100/(NVL(SUM(R.TCHARGE),0)+NVL(SUM(R.TDELAY),0)+NVL(SUM(R.TCHANGE),0)) PCT_UP
FROM MIXER.RUN_SUMM R, MIXER.SPEC S
WHERE R.SPEC_NUM=S.SPEC_NUM
AND R.MIXER_NUM IN(&&MIXER)
AND R.MIXER_NUM >=80
AND SHIFT_DT BETWEEN TO_DATE('&&START','MM/DD/RR') AND TO_DATE('&&END','MM/DD/RR')
GROUP BY R.SHIFT_DT
UNION
SELECT 'ALL' SHIFT_DT,
0 SHIFT_NUM,
' ' RUN_START_DT,
'***GRAND' COMPOUND,
'TOTAL' BAG_NAME,
SUM(R.BATCH_CNT)-NVL(SUM(R.ERROR_CNT),0) BATCH_CNT,
SUM(R.ERROR_CNT) ERROR_CNT,
SUM(EDIT_CNT) EDIT_CNT,
SUM(R.WT_PROD) WT_PROD,
SUM(R.TCHARGE) TCHARGE,
SUM(R.TDELAY) TDELAY,
SUM(R.TCHANGE) TCHANGE,
SUM(R.TNOTSCHED) TNOTSCHED,
NVL(SUM(R.TCHARGE),0)+NVL(SUM(R.TDELAY),0)+NVL(SUM(R.TCHANGE),0)+NVL(SUM(R.TNOTSCHED),0) RUN,
DECODE(SUM(R.BATCH_CNT)-SUM(R.ERROR_CNT),0,0,SUM(R.TCHARGE)/(SUM(R.BATCH_CNT)-SUM(R.ERROR_CNT))) AVG_CHARGE,
SUM(R.TCHARGE)*100/(NVL(SUM(R.TCHARGE),0)+NVL(SUM(R.TDELAY),0)+NVL(SUM(R.TCHANGE),0)) PCT_UP
FROM MIXER.RUN_SUMM R, MIXER.SPEC S
WHERE R.SPEC_NUM=S.SPEC_NUM
AND R.MIXER_NUM IN(&&MIXER)
AND R.MIXER_NUM >=80
AND SHIFT_DT BETWEEN TO_DATE('&&START','MM/DD/RR') AND TO_DATE('&&END','MM/DD/RR')
ORDER BY SHIFT_DT,RUN_START_DT;
COLUMN SHIFT_DT FORMAT A5 HEADING Shift|Date
COLUMN RUN_START_DT FORMAT A11 HEADING Run|Start
COLUMN COMPOUND FORMAT A10 HEADING |Compound
COLUMN BAG_NAME FORMAT A10 HEADING 'Bag Name'
BREAK ON SHIFT_DT SKIP PAGE ON SHIFT_NUM SKIP 1
CLEAR &&CLAUSE1
SELECT TO_CHAR(SHIFT_DT,'MM/DD') SHIFT_DT,
R.SHIFT_NUM,
TO_CHAR(RUN_START_DT,'MM/DD HH24:MI') RUN_START_DT,
S.COMPOUND,
R.BAG_NAME,
R.BAG_MIXER_NUM,
R.BATCH_CNT-NVL(R.ERROR_CNT,0) BATCH_CNT,
R.ERROR_CNT,
R.EDIT_CNT,
R.WT_PROD,
R.TCHARGE,
R.TDELAY,
R.TCHANGE,
R.TNOTSCHED,
NVL(R.TCHARGE,0)+NVL(R.TDELAY,0)+NVL(R.TCHANGE,0)+NVL(R.TNOTSCHED,0) RUN,
DECODE(R.BATCH_CNT-NVL(R.ERROR_CNT,0),0,0,R.TCHARGE/(R.BATCH_CNT-NVL(R.ERROR_CNT,0))) AVG_CHARGE
FROM MIXER.RUN_SUMM R, MIXER.SPEC S
WHERE R.SPEC_NUM=S.SPEC_NUM
AND R.MIXER_NUM IN(&&MIXER)
AND R.MIXER_NUM >=80
AND SHIFT_DT BETWEEN TO_DATE('&&START','MM/DD/RR') AND TO_DATE('&&END','MM/DD/RR')
AND ROWNUM<=&&ROWLIMIT
ORDER BY SHIFT_DT,RUN_START_DT;
SPOOL OFF
SET VERIFY ON
CLEAR BREAKS
CLEAR COMPUTES
Unfortunately, your VB.NET code has no idea what to do with all the SQL*Plus
commands embedded in your script. SQL*Plus
is the only application that supports the full set of commands. SQL Developer supports a subset of the SQL*Plus
commands. It looks like SQL Developer would support all the SQL*Plus
commands in this particular script but I'd need to go through the documentation to be sure.
The quick and dirty solution would be to shell out to the operating system from VB and invoke SQL*Plus
to produce the file and then let VB.NET return the file to the client. That's not particularly elegant and you'd have a problem in a multi-user environment because the script would try to spool the same file from two different sessions if it was called with the same parameters. But it appears that the legacy solution has the same multi-user problem already.
The more elegant solution would be to refactor the scripts to move as much of the logic as possible into a view. Your VB.NET code could call the view and present the data in a more elegant data table format rather than returning a simple flat file (assuming that this is intended to present data to humans for analysis rather than producing files in a particular format that are fed into some downstream process). That would be more effort than invoking SQL*Plus
but would mean that your upgrade of the legacy system would produce much more user-friendly results.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.