我正在使用Oracle SQL Developer进行文本挖掘:ODMiner ..我将数据“WEBLOG”导入到表中。这个博客数据包括用户活动,日期,时间,网址等。我采取的第一步是使用函数将数据表中的日期和时间转换为自01-01-1990以来代表40分钟的数字。我把它除以2400(40分钟内的秒数)。主要目的是为会议制定时间表。 我使用了以下代码,
CREATE OR REPLACE FUNCTION ssnDate(
DATE IN VARCHAR2 DEFAULT 03-01-18,
TIME IN VARCHAR2
) RETURN NUMBER
AS
BEGIN
RETURN TRUNC((to_date(DATE||' '||TIME, 'DD-MM-YY HH:MM:SS')- to_date('01-JAN- 1990','DD-MON-YYYY')) * (86400/2400);
END ssnDate;
这是运行语句后日志中出现的内容,
FUNCTION ssnDate compiled
Warning: execution completed with warning
在此之后,我尝试使用之前创建的ssnDate创建一个VIEW来转换DATE和TIME,并连接CS_URI_STEM(这是访问的资源)和CS_URI_QUERY(这是查询,如果有的话) ,客户端正试图进入一个名为WEB_LINK的新领域。
这是使用的代码,
CREATE OR REPLACE VIEW WEBLOG_VIEWS("C_IP", "WEB_LINK", "CS_USER_AGENT", "SESSION")
AS
SELECT ssnDate(LOG_DATE, LOG_TIME) AS 'SESSION',
C_IP,
CS_USER_AGENT,
(CS_URI_STEM||'?'||CS_URI_QUERY) AS WEB_LINK
FROM WEBLOG;
现在我发现了以下错误..
Error starting at line 1 in command:
CREATE OR REPLACE VIEW WEBLOG_VIEWS("C_IP", "WEB_LINK", "CS_USER_AGENT", "SESSION")
AS
SELECT ssnDate(LOG_DATE, LOG_TIME) AS 'SESSION',
C_IP,
CS_USER_AGENT,
(CS_URI_STEM||'?'||CS_URI_QUERY) AS WEB_LINK
FROM WEBLOG
Error at Command Line:3 Column:38
Error report:
SQL Error: ORA-00923: FROM keyword not found where expected
00923. 00000 - "FROM keyword not found where expected"
*Cause:
*Action:
我无法解决这个问题。这是数据准备阶段,需要我在应用建模技术或算法之前准备数据。下一步是将数据分组,基于会话时间,ip和每个会话的用户代理以及用户在该会话中访问的web_links字段。
对于我出错的地方或任何解决方案的任何输入,我真的很感激!
答案 0 :(得分:1)
在此行中使用双引号:
SELECT ssnDate(LOG_DATE, LOG_TIME) AS "SESSION",
答案 1 :(得分:0)
在这一小段代码中,您遇到了许多错误和效率低下的问题。
首先,
P_DATE IN VARCHAR2 DEFAULT 03-01-18
这个默认值是废话。你实际上说默认值是负16(3减去1 minnus 18!)。它应该是单引号
P_DATE IN VARCHAR2 DEFAULT '03-01-18'
其次,如果函数那么简单,我建议你只需要
TRUNC((to_date(DATE||' '||TIME, 'DD-MM-YY HH:MM:SS')- to_date('01-JAN-1990','DD-MON-YYYY')) * (86400/2400))
进入视图本身以避免上下文(SQL-> PLSQL)切换返回的每一行。如果要将其保留为函数,请阅读标量子查询缓存。即使用确定性函数(或在11g中使用result_cache)并将函数放入子查询中。
第三,您的视图定义列不与实际使用的列对齐。
CREATE OR REPLACE VIEW WEBLOG_VIEWS("C_IP", "WEB_LINK",
"CS_USER_AGENT", "SESSION")
AS
SELECT ssnDate(LOG_DATE, LOG_TIME) AS 'SESSION',
C_IP,
CS_USER_AGENT,
(CS_URI_STEM||'?'||CS_URI_QUERY) AS WEB_LINK
所以C_IP真的是" SESSION",WEB_LINK真的是C_IP等。
也不要在表/视图中使用SQL保留字(SESSION)。你只是为自己的背部制作一根杆,因为每次你选择这个视图时,你需要输入" SESSION"用引号代替会话。
最后,为什么要将日期和时间存储为CHAR数据而不是本机DATE?如果你可以改变它,从长远来看会好得多。特别是因为你使用YY格式存储日期,这比存储为YYYY更糟糕!
所以说的是,如果你想保留这个功能,把它改成这样的东西:
create or replace function ssndate(p_date in varchar2 default '03-01-18',
p_time in varchar2)
return number
$if dbms_db_version.ver_le_10 $then
deterministic
$elsif dbms_db_version.ver_le_11 $then
result_cache
$end
as
begin
return trunc((to_date(p_date||' '||p_time, 'dd-mm-yy hh24:mi:ss')
- to_date('01-jan-1990','dd-mon-yyyy')) * (86400/2400));
end ssndate;
/
如果您使用的是11g,那么$ code将只放置RESULT_CACHE,否则就是DETERMINISTIC。
并且视图应该包含此函数作为子查询:
create or replace view weblog_views
as
select (select ssndate(log_date, log_time) from dual) as "SESSION",
c_ip,
cs_user_agent,
(cs_uri_stem||'?'||cs_uri_query) as web_link
from weblog;