扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
GROUP BY TO_CHAR(ORDER_DATE,'YYYYMMDD')是按order_date的年月日是否相同做日期分组,你那代码执行有什么错误吗
在两当等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站制作、成都网站建设 网站设计制作按需搭建网站,公司网站建设,企业网站建设,高端网站设计,网络营销推广,外贸网站建设,两当网站建设费用合理。
如果是没有权限的话,照这下面做就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(数据库用户名);
首先我觉得你的逻辑有问题,既然数据库里面存在了表你就删除,但是你却把创建表的执行代码写在了else 条件里面;那意思如果数据库存在了你要创建的这张表,你的逻辑只是把它删除,但是却没有创建。
下面是我整理的代码你看看:
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实现需要的功能,首先在数据库中建表,其中一个字段为Blob类型,怎么创建就不说了。思路很简单,就是文件流读取电脑上的文件,然后通过insert语句将文件的字节流数组存进表中,代码如下:
//通过Stream读取文件,并转换为byte数组
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失败!rn"
+
"失败原因:t"
+
e1.Message
+
"rnrn");
}
finally
{
cmd.Close();
}
本来采用的是OleDb,后来测试发现不好使,好像是Provider的问题,然后改为OracleClient来进行上传,OracleClient不需要Provider。
关键是sql语句中Blob字段的参数要写成“:ParameterName”的形式。
其实先简单看,是从TB_CONTENT这张表中选取
strcontno, strmemlogname, inputchaser, inbargainor, dasubtime, intamountsum, strmainmater这些字段
其中strcontno, dasubtime, intamountsum, strmainmater正常显示出来
而另外strmemlogname, inputchaser, inbargainor三个字段的内容作为参数,传给函数,通过函数加工显示。
而pub_getdata_cs,pub_getdata应该是包的名字,从数据库的package里面能看到。
包的作用是封装了若干个存储过程,函数等。可以任意的调用其中的任何一个。
而lognm_getnm, get_corpname就是属于包中的函数名字,这两个函数是通过你输入的参数,完成特定的功能,比如输入一个编码,输出编码对应的名字,这就可以通过函数的功能完成。你的这个调用是类似的,把那三个字段加工,输出需要显示的内容,因为输出和你那三个字段是有关系的,所以才把那三个字段作为参数分别传入参数。
这个除开包和函数,是最基本的语法了,所以我想你的疑问,也在包和函数上,具体的函数功能是什么,没有代码,大家也没法猜,进去读读应该就知道了。
首先,可以肯定,你这是一个数据库的PL/SQL块。
如果你要进一步的了解,请找一下相关的语法资料。
下面我来给你分析一下。
DECLARE
Begin
End
这是一个PL/SQL块得结构。
CURSOR EMPCUR IS SELECT EMPNO,ENAME,SAL
FROM EMP WHERE DEPTNO = 30;
这是定义一个游标,也就是相当于一个查询的集合,暂时性的用个东西给保存起来,这个东西就是cursor,也叫游标。
TheEmpNo EMP.EMPNO%TYPE;
TheEName EMP.ENAME%TYPE;
TheSal EMP.SAL%TYPE;
上面这段的意思,是定义几个变量。
那TheEmpNo EMP.EMPNO%TYPE;这句意思是,定义一个跟emp表的empno字段类型一样的变量。
OPEN EMPCUR;
这个是要打开游标,也就是去让游标执行那个查询语句,获取数据。
LOOP
FETCH EMPCUR INTO TheEmpNo,TheEName,TheSal;
EXIT WHEN EMPCUR%NOTFOUND ;
DBMS_OUTPUT.PUT_LINE('编号-'||TheEmpNo||'员工姓名-'||TheEName||'工资-'||TheSal);
END LOOP;
如上的意思就是,循环的,把游标中的数据,一行一行的取出来,然后打印出来。
EXIT WHEN EMPCUR%NOTFOUND ;这行意思是,如果游标的数据取玩了,就退出。
在Oracle中如何利用Rowid查找和删除表中的重复记录 选择自 cn_chenfeng 的 Blog
关键字 在Oracle中如何利用Rowid查找和删除表中的重复记录
出处
平时工作中可能会遇到当试图对库表中的某一列或几列创建唯一索引时,系统提示 ORA-01452 :不能创建唯一索引,发现重复记录。
下面总结一下几种查找和删除重复记录的方法(以表CZ为例):
表CZ的结构如下:
SQL desc cz
Name Null? Type
----------------------------------------- -------- ------------------
C1 NUMBER(10)
C10 NUMBER(5)
C20 VARCHAR2(3)
删除重复记录的方法原理:
(1).在Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,rowid确定了每条记录是在Oracle中的哪一个数据文件、块、行上。
(2).在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中那些具有最大rowid的就可以了,其余全部删除。
重复记录判断的标准是:
C1,C10和C20这三列的值都相同才算是重复记录。
经查看表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.查找重复记录的几种方法:
(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.删除重复记录的几种方法:
(1).适用于有大量重复记录的情况(在C1,C10和C20列上建有索引的时候,用以下语句效率会很高):
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).适用于有少量重复记录的情况(注意,对于有大量重复记录的情况,用以下语句效率会很低):
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).适用于有少量重复记录的情况(临时表法):
SQLcreate table test as select distinct * from cz; (建一个临时表test用来存放重复的记录)
SQLtruncate table cz; (清空cz表的数据,但保留cz表的结构)
SQLinsert into cz select * from test; (再将临时表test里的内容反插回来)
(4).适用于有大量重复记录的情况(Exception into 子句法):
采用alter table 命令中的 Exception into 子句也可以确定出库表中重复的记录。这种方法稍微麻烦一些,为了使用“excepeion into ”子句,必须首先创建 EXCEPTIONS 表。创建该表的 SQL 脚本文件为 utlexcpt.sql 。对于win2000系统和 UNIX 系统, Oracle 存放该文件的位置稍有不同,在win2000系统下,该脚本文件存放在$ORACLE_HOME\Ora90\rdbms\admin 目录下;而对于 UNIX 系统,该脚本文件存放在$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.
从结果里可以看到重复记录已经删除。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流