GROUP BY TO_CHAR(ORDER_DATE,'YYYYMMDD')是按order_date的年月日是否相同做日期分組,你那代碼執(zhí)行有什么錯(cuò)誤嗎
在兩當(dāng)?shù)鹊貐^(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站制作、成都網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需搭建網(wǎng)站,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),網(wǎng)絡(luò)營(yíng)銷推廣,外貿(mào)網(wǎng)站建設(shè),兩當(dāng)網(wǎng)站建設(shè)費(fèi)用合理。
如果是沒(méi)有權(quán)限的話,照這下面做就OK了:
grant sysdba, dba, create session, create any table , create any view , create any index , create any procedure ,
alter any table , alter any procedure , drop any table , drop any view , drop any index , drop any procedure ,
select any table , insert any table , update any table , delete any table
to test_data(數(shù)據(jù)庫(kù)用戶名);
首先我覺(jué)得你的邏輯有問(wèn)題,既然數(shù)據(jù)庫(kù)里面存在了表你就刪除,但是你卻把創(chuàng)建表的執(zhí)行代碼寫在了else 條件里面;那意思如果數(shù)據(jù)庫(kù)存在了你要?jiǎng)?chuàng)建的這張表,你的邏輯只是把它刪除,但是卻沒(méi)有創(chuàng)建。
下面是我整理的代碼你看看:
create or replace procedure createtable(
tname varchar2
)
is
v_createsql varchar2(400);
v_dropsql varchar2(100);
v_count number(9);
begin
v_createsql:='create table '||tname||'(
a number(8) primary key,
b varchar2(20))';
v_dropsql:='drop table '||tname||' cascade constraints';
select count(*) into v_count from user_tables where table_name=upper('java7');
if v_count0 then
execute immediate v_dropsql;
commit;
end if;
execute immediate v_createsql;
commit;
end;
begin
createtable('java7');
end;
-- select * from java7
采用winform實(shí)現(xiàn)需要的功能,首先在數(shù)據(jù)庫(kù)中建表,其中一個(gè)字段為Blob類型,怎么創(chuàng)建就不說(shuō)了。思路很簡(jiǎn)單,就是文件流讀取電腦上的文件,然后通過(guò)insert語(yǔ)句將文件的字節(jié)流數(shù)組存進(jìn)表中,代碼如下:
//通過(guò)Stream讀取文件,并轉(zhuǎn)換為byte數(shù)組
Stream
stream
=
File.Open(ChoosedFilePaths[i],
FileMode.Open,
FileAccess.Read,
FileShare.Read);
byte[]
buffer
=
new
byte[stream.Length];
stream.Read(buffer,
0,
buffer.Length);
string
constr
=
ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
OracleConnection
conn
=
new
OracleConnection(constr);
OracleParameter
param
=
null;
OracleCommand
cmd
=
new
OracleCommand();
cmd.Connection
=
conn;
cmd.CommandText
=
"insert
into
FJG_FILE_MANAGE(NUMBERS,FILE_NAME,FILECONTENT)
VALUES('"
+
attributes.Number
+
"','"
+
attributes.FileName
+
"',:contents,'")";
param
=
new
OracleParameter("contents",
OracleType.Blob,
buffer.Length);
param.Value
=
buffer;
cmd.Parameters.Add(param);
try
{
conn.Open();
cmd.ExecuteNonQuery();
}
catch(System.Exception
e)
{
log.Append("上傳狀態(tài):t失??!rn"
+
"失敗原因:t"
+
e1.Message
+
"rnrn");
}
finally
{
cmd.Close();
}
本來(lái)采用的是OleDb,后來(lái)測(cè)試發(fā)現(xiàn)不好使,好像是Provider的問(wèn)題,然后改為OracleClient來(lái)進(jìn)行上傳,OracleClient不需要Provider。
關(guān)鍵是sql語(yǔ)句中Blob字段的參數(shù)要寫成“:ParameterName”的形式。
其實(shí)先簡(jiǎn)單看,是從TB_CONTENT這張表中選取
strcontno, strmemlogname, inputchaser, inbargainor, dasubtime, intamountsum, strmainmater這些字段
其中strcontno, dasubtime, intamountsum, strmainmater正常顯示出來(lái)
而另外strmemlogname, inputchaser, inbargainor三個(gè)字段的內(nèi)容作為參數(shù),傳給函數(shù),通過(guò)函數(shù)加工顯示。
而pub_getdata_cs,pub_getdata應(yīng)該是包的名字,從數(shù)據(jù)庫(kù)的package里面能看到。
包的作用是封裝了若干個(gè)存儲(chǔ)過(guò)程,函數(shù)等??梢匀我獾恼{(diào)用其中的任何一個(gè)。
而lognm_getnm, get_corpname就是屬于包中的函數(shù)名字,這兩個(gè)函數(shù)是通過(guò)你輸入的參數(shù),完成特定的功能,比如輸入一個(gè)編碼,輸出編碼對(duì)應(yīng)的名字,這就可以通過(guò)函數(shù)的功能完成。你的這個(gè)調(diào)用是類似的,把那三個(gè)字段加工,輸出需要顯示的內(nèi)容,因?yàn)檩敵龊湍隳侨齻€(gè)字段是有關(guān)系的,所以才把那三個(gè)字段作為參數(shù)分別傳入?yún)?shù)。
這個(gè)除開(kāi)包和函數(shù),是最基本的語(yǔ)法了,所以我想你的疑問(wèn),也在包和函數(shù)上,具體的函數(shù)功能是什么,沒(méi)有代碼,大家也沒(méi)法猜,進(jìn)去讀讀應(yīng)該就知道了。
首先,可以肯定,你這是一個(gè)數(shù)據(jù)庫(kù)的PL/SQL塊。
如果你要進(jìn)一步的了解,請(qǐng)找一下相關(guān)的語(yǔ)法資料。
下面我來(lái)給你分析一下。
DECLARE
Begin
End
這是一個(gè)PL/SQL塊得結(jié)構(gòu)。
CURSOR EMPCUR IS SELECT EMPNO,ENAME,SAL
FROM EMP WHERE DEPTNO = 30;
這是定義一個(gè)游標(biāo),也就是相當(dāng)于一個(gè)查詢的集合,暫時(shí)性的用個(gè)東西給保存起來(lái),這個(gè)東西就是cursor,也叫游標(biāo)。
TheEmpNo EMP.EMPNO%TYPE;
TheEName EMP.ENAME%TYPE;
TheSal EMP.SAL%TYPE;
上面這段的意思,是定義幾個(gè)變量。
那TheEmpNo EMP.EMPNO%TYPE;這句意思是,定義一個(gè)跟emp表的empno字段類型一樣的變量。
OPEN EMPCUR;
這個(gè)是要打開(kāi)游標(biāo),也就是去讓游標(biāo)執(zhí)行那個(gè)查詢語(yǔ)句,獲取數(shù)據(jù)。
LOOP
FETCH EMPCUR INTO TheEmpNo,TheEName,TheSal;
EXIT WHEN EMPCUR%NOTFOUND ;
DBMS_OUTPUT.PUT_LINE('編號(hào)-'||TheEmpNo||'員工姓名-'||TheEName||'工資-'||TheSal);
END LOOP;
如上的意思就是,循環(huán)的,把游標(biāo)中的數(shù)據(jù),一行一行的取出來(lái),然后打印出來(lái)。
EXIT WHEN EMPCUR%NOTFOUND ;這行意思是,如果游標(biāo)的數(shù)據(jù)取玩了,就退出。
在Oracle中如何利用Rowid查找和刪除表中的重復(fù)記錄 選擇自 cn_chenfeng 的 Blog
關(guān)鍵字 在Oracle中如何利用Rowid查找和刪除表中的重復(fù)記錄
出處
平時(shí)工作中可能會(huì)遇到當(dāng)試圖對(duì)庫(kù)表中的某一列或幾列創(chuàng)建唯一索引時(shí),系統(tǒng)提示 ORA-01452 :不能創(chuàng)建唯一索引,發(fā)現(xiàn)重復(fù)記錄。
下面總結(jié)一下幾種查找和刪除重復(fù)記錄的方法(以表CZ為例):
表CZ的結(jié)構(gòu)如下:
SQL desc cz
Name Null? Type
----------------------------------------- -------- ------------------
C1 NUMBER(10)
C10 NUMBER(5)
C20 VARCHAR2(3)
刪除重復(fù)記錄的方法原理:
(1).在Oracle中,每一條記錄都有一個(gè)rowid,rowid在整個(gè)數(shù)據(jù)庫(kù)中是唯一的,rowid確定了每條記錄是在Oracle中的哪一個(gè)數(shù)據(jù)文件、塊、行上。
(2).在重復(fù)的記錄中,可能所有列的內(nèi)容都相同,但rowid不會(huì)相同,所以只要確定出重復(fù)記錄中那些具有最大rowid的就可以了,其余全部刪除。
重復(fù)記錄判斷的標(biāo)準(zhǔn)是:
C1,C10和C20這三列的值都相同才算是重復(fù)記錄。
經(jīng)查看表CZ總共有16條記錄:
SQLset pagesize 100
SQLselect * from cz;
C1 C10 C20
---------- ---------- ---
1 2 dsf
1 2 dsf
1 2 dsf
1 2 dsf
2 3 che
1 2 dsf
1 2 dsf
1 2 dsf
1 2 dsf
2 3 che
2 3 che
2 3 che
2 3 che
3 4 dff
3 4 dff
3 4 dff
4 5 err
5 3 dar
6 1 wee
7 2 zxc
20 rows selected.
1.查找重復(fù)記錄的幾種方法:
(1).SQLselect * from cz group by c1,c10,c20 having count(*) 1;
C1 C10 C20
---------- ---------- ---
1 2 dsf
2 3 che
3 4 dff
(2).SQLselect distinct * from cz;
C1 C10 C20
---------- ---------- ---
1 2 dsf
2 3 che
3 4 dff
(3).SQLselect * from cz a where rowid=(select max(rowid) from cz where c1=a.c1 and c10=a.c10 and c20=a.c20);
C1 C10 C20
---------- ---------- ---
1 2 dsf
2 3 che
3 4 dff
2.刪除重復(fù)記錄的幾種方法:
(1).適用于有大量重復(fù)記錄的情況(在C1,C10和C20列上建有索引的時(shí)候,用以下語(yǔ)句效率會(huì)很高):
SQLdelete cz where (c1,c10,c20) in (select c1,c10,c20 from cz group by c1,c10,c20 having count(*)1) and rowid not in
(select min(rowid) from cz group by c1,c10,c20 having count(*)1);
SQLdelete cz where rowid not in(select min(rowid) from cz group by c1,c10,c20);
(2).適用于有少量重復(fù)記錄的情況(注意,對(duì)于有大量重復(fù)記錄的情況,用以下語(yǔ)句效率會(huì)很低):
SQLdelete from cz a where a.rowid!=(select max(rowid) from cz b where a.c1=b.c1 and a.c10=b.c10 and a.c20=b.c20);
SQLdelete from cz a where a.rowid(select max(rowid) from cz b where a.c1=b.c1 and a.c10=b.c10 and a.c20=b.c20);
SQLdelete from cz a where rowid (select max(rowid) from cz where c1=a.c1 and c10=a.c10 and c20=a.c20);
(3).適用于有少量重復(fù)記錄的情況(臨時(shí)表法):
SQLcreate table test as select distinct * from cz; (建一個(gè)臨時(shí)表test用來(lái)存放重復(fù)的記錄)
SQLtruncate table cz; (清空cz表的數(shù)據(jù),但保留cz表的結(jié)構(gòu))
SQLinsert into cz select * from test; (再將臨時(shí)表test里的內(nèi)容反插回來(lái))
(4).適用于有大量重復(fù)記錄的情況(Exception into 子句法):
采用alter table 命令中的 Exception into 子句也可以確定出庫(kù)表中重復(fù)的記錄。這種方法稍微麻煩一些,為了使用“excepeion into ”子句,必須首先創(chuàng)建 EXCEPTIONS 表。創(chuàng)建該表的 SQL 腳本文件為 utlexcpt.sql 。對(duì)于win2000系統(tǒng)和 UNIX 系統(tǒng), Oracle 存放該文件的位置稍有不同,在win2000系統(tǒng)下,該腳本文件存放在$ORACLE_HOME\Ora90\rdbms\admin 目錄下;而對(duì)于 UNIX 系統(tǒng),該腳本文件存放在$ORACLE_HOME/rdbms/admin 目錄下。
具體步驟如下:
SQL@?/rdbms/admin/utlexcpt.sql
Table created.
SQLdesc exceptions
Name Null? Type
----------------------------------------- -------- --------------
ROW_ID ROWID
OWNER VARCHAR2(30)
TABLE_NAME VARCHAR2(30)
CONSTRAINT VARCHAR2(30)
SQLalter table cz add constraint cz_unique unique(c1,c10,c20) exceptions into exceptions;
*
ERROR at line 1:
ORA-02299: cannot validate (TEST.CZ_UNIQUE) - duplicate keys found
SQLcreate table dups as select * from cz where rowid in (select row_id from exceptions);
Table created.
SQLselect * from dups;
C1 C10 C20
---------- ---------- ---
1 2 dsf
1 2 dsf
1 2 dsf
1 2 dsf
2 3 che
1 2 dsf
1 2 dsf
1 2 dsf
1 2 dsf
2 3 che
2 3 che
2 3 che
2 3 che
3 4 dff
3 4 dff
3 4 dff
16 rows selected.
SQLselect row_id from exceptions;
ROW_ID
------------------
AAAHD/AAIAAAADSAAA
AAAHD/AAIAAAADSAAB
AAAHD/AAIAAAADSAAC
AAAHD/AAIAAAADSAAF
AAAHD/AAIAAAADSAAH
AAAHD/AAIAAAADSAAI
AAAHD/AAIAAAADSAAG
AAAHD/AAIAAAADSAAD
AAAHD/AAIAAAADSAAE
AAAHD/AAIAAAADSAAJ
AAAHD/AAIAAAADSAAK
AAAHD/AAIAAAADSAAL
AAAHD/AAIAAAADSAAM
AAAHD/AAIAAAADSAAN
AAAHD/AAIAAAADSAAO
AAAHD/AAIAAAADSAAP
16 rows selected.
SQLdelete from cz where rowid in ( select row_id from exceptions);
16 rows deleted.
SQLinsert into cz select distinct * from dups;
3 rows created.
SQLselect *from cz;
C1 C10 C20
---------- ---------- ---
1 2 dsf
2 3 che
3 4 dff
4 5 err
5 3 dar
6 1 wee
7 2 zxc
7 rows selected.
從結(jié)果里可以看到重復(fù)記錄已經(jīng)刪除。