Groovy - Multi Table Spin to File
Я запускаю многостоловый вызов SQL, который выводит файл file.write. Код работает в SQuirreL и даже в Groovy, пока я не доберусь до строк file.write("") (последние 4 строки кода). Первое сообщение об ошибке я получаю "потому что: ORA-00911: недопустимый символ", остальные похожи на него.
Вот где я думаю, что ошибка находится:
file.write("")
db.eachRow(sql) {
file.append(it.MOPID + "\t" + it.EOM + "\t" + it.Mopstart + "\n")
Я думаю, что проблема с моим кодом состоит в том, что существует более одной таблицы, и во время записи что-то портится. Ваши знания очень ценятся.
С уважением ~ Corpa Loom <3
Ниже приведен полный код:
import groovy.sql.Sql
def db = Sql.newInstance(
'jdbc:oracle:thin:@XX.XX.XX.XXX:XXXX:ORCL',
'reporter', 'XXXXXXX', 'oracle.jdbc.XXXX.OracleDataSource')
def sql = """
DROP TABLE TEMPXMOP24;
CREATE TABLE TEMPXMOP24
(
MOPID VARCHAR2(12),
TYPE VARCHAR2(200),
MOPSTART DATE,
MOPAPPROVEDTIME DATE,
TIME_DIF VARCHAR2(45),
TIME_ORDER NUMBER(10),
FIXED_MOP VARCHAR2(12),
MOP_HR VARCHAR2(2)
);
INSERT INTO TEMPXMOP24 (MOPID,TYPE,MOPSTART,MOPAPPROVEDTIME,TIME_DIF,TIME_ORDER,FIXED_MOP,MOP_HR)
SELECT MOPACTIVITY.MOPID,
MOPACTIVITY.MOPSERVICEIMPACTED "TYPE",
MOPACTIVITY.MOPSTART,
MOPACTIVITY.MOPAPPROVEDTIME,
ROUND(MOPACTIVITY.MOPSTART - MOPACTIVITY.MOPAPPROVEDTIME,2)||' days' "TIME_DIF",
ROUND(MOPACTIVITY.MOPSTART - MOPACTIVITY.MOPAPPROVEDTIME,0) "TIME_ORDER",
(CASE
WHEN SUBSTR(MOPACTIVITY.MOPID, 7, 2) = '24' THEN SUBSTR(MOPACTIVITY.MOPID, 1, 6)||'00'||SUBSTR(MOPACTIVITY.MOPID, 9, 4)
ELSE MOPACTIVITY.MOPID
END ) FIXED_MOP,
(CASE
WHEN SUBSTR(MOPACTIVITY.MOPID, 7, 2) = '24' THEN SUBSTR(MOPACTIVITY.MOPID, 7, 2)
ELSE SUBSTR(MOPACTIVITY.MOPID, 7, 2)
END ) MOP_HR
FROM MOPUSER.MOPACTIVITY
WHERE MOPACTIVITY.MOPSTART - MOPACTIVITY.MOPAPPROVEDTIME BETWEEN 0 and 14;
SELECT * FROM TEMPXMOP24
WHERE TRUNC(TO_DATE(FIXED_MOP, 'MMDDYYHH24MISS'))
BETWEEN TRUNC(SYSDATE-90) AND TRUNC(SYSDATE)
ORDER BY "TIME_ORDER"
"""
def date = new Date()
def dts = date.format("yyyy-MM-dd-HH-mm-ss")
File file = new File('C:/OUTPUT/' +dts + ' Past Due CM Mops.xls')
file.write("")
db.eachRow(sql) {
file.append(it.MOPID + "\t" + it.TYPE + "\t" + it.MOPSTART + "\n")
}
2 ответа
Вот твоя починка Копра. Очень рад видеть тебя в прошедшие выходные.
import groovy.sql.Sql
def db = Sql.newInstance(
'jdbc:oracle:thin:@10.10.47.193:1521:ORCL',
'reporter', 'r3p0rt3r', 'oracle.jdbc.pool.OracleDataSource')
def sql = """
SELECT * FROM
(SELECT MOPACTIVITY.MOPID,
MOPACTIVITY.MOPSERVICEIMPACTED "TYPE",
MOPACTIVITY.MOPSTART,
MOPACTIVITY.MOPAPPROVEDTIME,
ROUND(MOPACTIVITY.MOPSTART - MOPACTIVITY.MOPAPPROVEDTIME,2)||' days' "TIME_DIF",
ROUND(MOPACTIVITY.MOPSTART - MOPACTIVITY.MOPAPPROVEDTIME,0) "TIME_ORDER",
(CASE
WHEN SUBSTR(MOPACTIVITY.MOPID, 7, 2) = '24' THEN SUBSTR(MOPACTIVITY.MOPID, 1, 6)||'00'||SUBSTR(MOPACTIVITY.MOPID, 9, 4)
ELSE MOPACTIVITY.MOPID
END ) FIXED_MOP,
(CASE
WHEN SUBSTR(MOPACTIVITY.MOPID, 7, 2) = '24' THEN SUBSTR(MOPACTIVITY.MOPID, 7, 2)
ELSE SUBSTR(MOPACTIVITY.MOPID, 7, 2)
END ) MOP_HR
FROM MOPUSER.MOPACTIVITY
WHERE MOPACTIVITY.MOPSTART - MOPACTIVITY.MOPAPPROVEDTIME BETWEEN 0 and 14)
WHERE TRUNC(TO_DATE(FIXED_MOP, 'MMDDYYHH24MISS'))
BETWEEN TRUNC(SYSDATE-90) AND TRUNC(SYSDATE)
ORDER BY "TIME_ORDER"
"""
def date = new Date()
def dts = date.format("yyyy-MM-dd-HH-mm-ss")
File file = new File('C:/Output/' + dts + ' EXPEDITE_MOPS.xls')
file.write("")
db.eachRow(sql) {
file.append(it.MOPID + "\t" + it.TYPE + "\n")
}
Я не уверен, проверяете ли вы sql, возвращая какие-либо строки в первую очередь. Я возился с твоим SQL, и он оказался неверным. То, как вы написали свой sql прямо сейчас, вообще не вернет ни одной строки, хотя и говорит, что она действительна.
Ожидаемая проблема:AND to_char(mopactivity.mopend, 'dd-mon-yyyy hh24:mi:') > '2013-05-28 06:01'
В приведенной выше строке вы пытаетесь сравнить два varchars
различных форматов, которые никогда не дадут никакого результата.
Вот SQL Fiddle специально для вашего sql с правильными форматами. Попробуйте это.