创建或替换功能错误

时间:2012-12-04 02:04:53

标签: sql oracle

我正在使用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字段。

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

2 个答案:

答案 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;