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

この後、以前に作成した ssnDate で DATE と TIME を変換する VIEW を作成し、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」と入力する必要があるため、自分の背中用のロッドを作成しているだけです。

最後に、日付と時刻をネイティブの DATE ではなく CHAR データとして保存するのはなぜですか? それを変えることができれば、長期的にはずっと良くなるでしょう。特に、YYYY として保存するよりもさらに悪い罪である YY 形式を使用して日付を保存しているためです。

以上のことから、関数を保持したい場合は、次のように変更します。

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 に答える