1

我正在使用 Oracle SQL Developer:ODMiner 进行文本挖掘。我将数据“WEBLOG”导入到表中。这个博客数据包括用户活动、日期、时间、url 等。我采取的第一步是使用将数据表中的日期和时间转换为表示自 1990 年 1 月 1 日以来 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

在此之后,我尝试创建一个 VIEW 以使用之前创建的 ssnDate 转换 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 字段。

对于我出错的地方或任何类型的解决方案,我真的很感激!

4

2 回答 2

1

在这一行中使用双引号:

SELECT ssnDate(LOG_DATE, LOG_TIME) AS "SESSION",
于 2012-12-04T03:43:13.977 回答
0

在这个小段代码中你有很多错误和低效率。

第一,

P_DATE IN VARCHAR2 DEFAULT 03-01-18

这个默认值是无稽之谈。您实际上是在说默认值为负 16(3 减 1 分 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,那么 $ 代码只会放置 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;
于 2012-12-04T10:44:21.413 回答