有一大段SQL语句,如何封装成一个存储过程,以方便其他程序调用?如何将其中的'a.b.c00' 部分用变量代替?

Create Table #Mutidata ( FIndex int IDENTITY,FEntryID INT, FBomInterid int, FItemID int null, FNeedQty decimal(28,14) default(0) null, FBOMLevel int null, FItemType int null, FParentID int default(0)null, FRate decimal(28,14) default(0) null, FHistory int default(0) null, FHaveMrp smallint default(0) null, FLevelString varchar(200) null, FBom int, FMaterielType int default(371) null,FOperID int default(0))
Create Table #MutiParentItem( FIndex int IDENTITY,FEntryID INT default(0), FBomInterid int, FItemID int null, FNeedQty decimal(28,14) default(0) null, FBOMLevel int null, FItemType int null, FParentID int default(0)null, FRate decimal(28,14) default(0) null, FHistory int default(0) null, FHaveMrp smallint default(0) null, FLevelString varchar(200) null , FBom int, FMaterielType int default(371) null,FOperID int default(0))
Create Table #Errors ( FIndex int IDENTITY, FType smallint default(0), FErrText varchar(355) )
go
Insert into #mutiParentItem (fbominterid,FItemID,FNeedQty,FBOMLevel,FParentID,FItemType,FBom) Select a.finterid, t1.FItemID,a.fqty, 0,0,t1.FErpClsID,t1.FItemID
From icbom a,t_ICItem t1 Where t1.FItemID = a.fitemid and a.fstatus=1 and t1.fnumber='a.b.c00' --如何将其中的'a.b.c00' 部分用变量代替(这个是一个物料代码)
declare @P1 int
set @P1=0
declare @P2 char(400)
set @P2=' '
exec PlanMutiBomExpandEx 50, 1, '01 1 1900 12:00:00:000AM', '01 1 2100 12:00:00:000AM', @P1 output, @P2 output
go
select a.FIndex,a.FitemID,a.FItemType, a.FBOMLevel,a.FLevelString FLevel,b.fnumber FNumber,b.fname FName,isnull(b.FModel,'') FModel,
a.FNeedQty FQty,d.FScrap,isnull(i.fname,'') FUseStatus,isnull(k.fprice,0) fprice,a.FNeedQty*isnull(k.fprice,0) 金额
from #Mutidata a
inner join t_icitem b on a.fitemid=b.fitemid
inner join icbomchild d on a.FBomInterid=d.finterid and a.FOperID=d.FOperID AND a.FEntryID=d.FEntryID and a.FItemID=d.FItemID
left outer join t_submessage i on b.fusestate=i.finterid
left outer join(select distinct fitemid,sum(a.famount)/sum(a.fqty) fprice
from icstockbillentry a
left join icstockbill b on a.finterid=b.finterid and b.ftrantype=1 and b.frob=1
where b.fdate between '2007-01-01' and '2016-12-31'
group by fitemid
union all
select distinct fitemid,sum(a.famount)/sum(a.fqty) fprice
from icstockbillentry a
left join icstockbill b on a.finterid=b.finterid and b.ftrantype=1 and b.frob=1
where b.fdate=(select max(z.fdate) from icstockbill z,icstockbillentry x where x.fitemid=a.fitemid and z.finterid=x.finterid and z.ftrantype=1 and z.frob=1 )
and FItemID not in(select distinct fitemid from icstockbillentry a
left join icstockbill b on a.finterid=b.finterid and b.ftrantype=1 and b.frob=1
where b.fdate between '2007-01-01' and '2016-12-31')
group by fitemid
)k on k.fitemid=a.fitemid
where 1=1

union
select a.FIndex,a.FitemID,a.FItemType, a.FBOMLevel,a.FLevelString FLevel,b.fnumber FNumber,b.fname FName,isnull(b.FModel,'') FModel,
a.FNeedQty FQty,d.FScrap,isnull(i.fname,'') FUseStatus,isnull(k.fprice,0),a.FNeedQty*isnull(k.fprice,0) 金额
from #Mutidata a
inner join t_icitem b on a.fitemid=b.fitemid
inner join iccustbomchild d on a.FBomInterid=d.finterid and a.FItemID=d.FItemID and a.FOperID=d.FOperID AND a.FEntryID=d.FEntryID
left outer join t_submessage i on b.fusestate=i.finterid
left outer join(select distinct fitemid,sum(a.famount)/sum(a.fqty) fprice
from icstockbillentry a
left join icstockbill b on a.finterid=b.finterid and b.ftrantype=1 and b.frob=1
where b.fdate between '2007-01-01' and '2016-12-31'
group by fitemid
union all
select distinct fitemid,sum(a.famount)/sum(a.fqty) fprice
from icstockbillentry a
left join icstockbill b on a.finterid=b.finterid and b.ftrantype=1 and b.frob=1
where b.fdate=(select max(z.fdate) from icstockbill z,icstockbillentry x where x.fitemid=a.fitemid and z.finterid=x.finterid and z.ftrantype=1 and z.frob=1 )
and FItemID not in(select distinct fitemid from icstockbillentry a
left join icstockbill b on a.finterid=b.finterid and b.ftrantype=1 and b.frob=1
where b.fdate between '2007-01-01' and '2016-12-31')
group by fitemid
)k on k.fitemid=a.fitemid
where 1=1
union
select a.FIndex,a.FitemID,a.FItemType, a.FBOMLevel,a.FLevelString FLevel,b.fnumber FNumber,b.fname FName,isnull(b.FModel,'') FModel,
a.FNeedQty FQty,0 FScrap,isnull(i.fname,'') FUseStatus,isnull(k.fprice,0),a.FNeedQty*isnull(k.fprice,0) 金额
from #Mutidata a
inner join t_icitem b on a.fitemid=b.fitemid
inner join icbom d on a.FBomInterid=d.finterid and a.FItemID=d.FItemID
left outer join t_submessage i on b.fusestate=i.finterid
left outer join(select distinct fitemid,sum(a.famount)/sum(a.fqty) fprice
from icstockbillentry a
left join icstockbill b on a.finterid=b.finterid and b.ftrantype=1 and b.frob=1
where b.fdate between '2007-01-01' and '2016-12-31'
group by fitemid
union all
select distinct fitemid,sum(a.famount)/sum(a.fqty) fprice
from icstockbillentry a
left join icstockbill b on a.finterid=b.finterid and b.ftrantype=1 and b.frob=1
where b.fdate=(select max(z.fdate) from icstockbill z,icstockbillentry x where x.fitemid=a.fitemid and z.finterid=x.finterid and z.ftrantype=1 and z.frob=1 )
and FItemID not in(select distinct fitemid from icstockbillentry a
left join icstockbill b on a.finterid=b.finterid and b.ftrantype=1 and b.frob=1
where b.fdate between '2007-01-01' and '2016-12-31')
group by fitemid
)k on k.fitemid=a.fitemid
where 1=1
order by FIndex desc
go
drop table #Mutidata
drop table #MutiParentItem
drop table #Errors

3个回答

那你就在数据库Procedures里新建一个存储过程被 重复的数值或字符 可以在开始时定义常量的。

新建一个存储过程,把上面的语句复制过去,报错!!!(上面的语句单独运行是正常的)

百度----sql 如何创建一个存储过程

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
MySQL 如何仅用一条SQL语句或存储过程或自定义函数 判断两条记录之间是否存在层级关联
![图片说明](https://img-ask.csdn.net/upload/201901/18/1547775595_628892.jpg) > 表格不止四个,还可能有表E、F、G。 数据库表之间的关系如图,子表的每条记录通过'parent_id'和'parent_table'两个属性指向父表的一条记录。所有表均包含这两个属性(A表中该值为空)。 如何只用一条SQL语句(或者写一个存储过程、自定义函数)用以判断任意两条记录之间知否有层级间的从属关系? 我尝试用动态执行SQL语句和递归去实现,但是由于技艺不精都失败了。请问各位大大这可如何是好啊~
Mysql 存储过程问题
大家好,我遇到一个 很诡异的问题 今天写了一个存储过程 / PROCEDURE `video_center`.`updateusercourse`(IN id VARCHAR(20),IN videoname VARCHAR(50),IN author_id INT(11),IN vedio_id INT(11),OUT mychr VARCHAR(200)) 这个只是代码的开始的一部分 /**用户的名字*/ DECLARE authorname VARCHAR(20); SELECT `name` INTO authorname FROM `vc_user` WHERE id=304633; SELECT CONCAT('better hope myVar is not null', 'author_id',authorname) INTO mychr; 以上只是部分代码 存储过程本身编译是通过的 但是问题是 我 用select into 给变量赋值的时候出现了 问题 SELECT `name` INTO authorname FROM `vc_user` WHERE id=304633; 首先这条sql 语句如果单独执行不赋值的话 是能查询出来值的 然后 使用这条sql 语句 给返回的值 赋值 可以怎么也付不了值 不知道什么原因,我用java 调用这个存储过程 返回的值始终是 null SELECT CONCAT('better hope myVar is not null', 'author_id',authorname) INTO mychr; 那位大牛给看看 这方面的问题 不胜感激。
如何优化这个sql语句
SELECT a.type, b.postnature, b.compcode FROM 职工岗位管理情况表 AS b INNER JOIN 在职职工基本信息表 AS a ON b.name = a.statusname WHERE (a.move = '在岗') and (type IN (SELECT name FROM 在职职工基本信息表用工类别维护表)) AND (postnature IN (SELECT name FROM 职工岗位性质维护表)) 如果数据量很小,希望能做到以上的执行结果。 但是如果数据量大,目前最少已有50000条记录,数据库为sqlserver2005,请问该如何优化sql语句或者如何写这个效果。 [b]问题补充:[/b] set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go alter proc zgrytj (@username varchar(100),@tablename varchar(50)) as begin declare @qycode varchar(100), @rolename varchar(100), @gwlb varchar(100), @gwxz varchar(100), @rcount int, @ctotalcount int, @rtotalcount int, @rname varchar(50), @cname varchar(50), @totalcount int, @sqlstr nvarchar(4000), @sqlstrI nvarchar(4000), @sqlstrII nvarchar(4000) create table #test( rcount int, ctotalcount int, rtotalcount int, rname varchar(50), cname varchar(50), ) select @qycode=b.code from sys_user a,sys_企业信息表 b where a.corporation=b.code and a.username=@username select @rolename=rolename from sys_memberofrole where member=@username -----------------如果不是系统帐号查询出单条的信息------ if @rolename<>'系统管理员' and @rolename<>'省局领导' begin --申明游标 declare gwlb CURSOR FOR select name from 在职职工基本信息表用工类别维护表 order by id --打开游标 open gwlb fetch from gwlb into @gwlb WHILE @@FETCH_STATUS = 0 begin declare gwxz cursor for select name from 职工岗位性质维护表 order by id open gwxz fetch from gwxz into @gwxz WHILE @@FETCH_STATUS = 0 begin select @sqlstr='select @a=count(*) from '+@tablename+' where '+ ' type ='''+@gwlb+''' and postnature='''+@gwxz+''' and compcode='''+@qycode+'''' select @sqlstrI='select @a=count(*) from '+@tablename+' where '+ ' type ='''+@gwlb+''' and compcode='''+@qycode+'''' select @sqlstrII='select @a=count(*) from '+@tablename+' where '+ ' postnature ='''+@gwxz+''' and compcode='''+@qycode+'''' exec sp_executesql @sqlstr,N'@a int output',@rcount output exec sp_executesql @sqlstrI,N'@a int output',@rtotalcount output exec sp_executesql @sqlstrII,N'@a int output',@ctotalcount output insert into #test values(@rcount,@ctotalcount,@rtotalcount,@gwlb,@gwxz) fetch next from gwxz into @gwxz end close gwxz deallocate gwxz fetch next from gwlb into @gwlb end CLOSE gwlb--关闭游标 DEALLOCATE gwlb--释放游标 select * from #test end else begin --申明游标 declare gwlb CURSOR FOR select name from 在职职工基本信息表用工类别维护表 order by id --打开游标 open gwlb fetch from gwlb into @gwlb WHILE @@FETCH_STATUS = 0 begin declare gwxz cursor for select name from 职工岗位性质维护表 order by id open gwxz fetch from gwxz into @gwxz WHILE @@FETCH_STATUS = 0 begin select @sqlstr='select @a=count(*) from '+@tablename+' where '+ ' type ='''+@gwlb+''' and postnature='''+@gwxz+'''' select @sqlstrI='select @a=count(*) from '+@tablename+' where '+ ' type ='''+@gwlb+'''' select @sqlstrII='select @a=count(*) from '+@tablename+' where '+ ' postnature ='''+@gwxz+'''' exec sp_executesql @sqlstr,N'@a int output',@rcount output exec sp_executesql @sqlstrI,N'@a int output',@rtotalcount output exec sp_executesql @sqlstrII,N'@a int output',@ctotalcount output insert into #test values(@rcount,@ctotalcount,@rtotalcount,@gwlb,@gwxz) fetch next from gwxz into @gwxz end close gwxz deallocate gwxz fetch next from gwlb into @gwlb end CLOSE gwlb--关闭游标 DEALLOCATE gwlb--释放游标 select * from #test end end 按照 SELECT a.type, b.postnature, b.compcode FROM 职工岗位管理情况表 AS b INNER JOIN 在职职工基本信息表 AS a ON b.name = a.statusname join 在职职工基本信息表用工类别维护表 c on a.type = c.name join 职工岗位性质维护表 d on b.postnature = d.name WHERE (a.move = '在岗') 建好的视图 名为 zgry 之前问的那个sql语句是为了在这个存储过程中调用的动态表或视图.问题I:select count(*),postnature from zgry group by postnature这个语句执行起来都费事.问题II:我不知道存储过程是否也能优化,不知道有什么问题,之前写的一个没执行很快,和这个存储过程差不多,就是动态传入的视图或表的数据量较大。希望能够给与支持。
如何将数据从 SQL Server 2005导出到 MySQL
我用SQL Server 2005 获取大量数据都快找疯了。我搞到了一个包含300多个表的数据库,需要把它变成一个 MySQL 数据库。我的第一个call是使用 bcp,但不幸的是,它不能生成有效的 CSV 字符串——字符串没有封装,因此不能处理任何包含带有逗号的字符串的行(或者您使用的任何分隔符) ,而且我仍然必须手工编写所有创建表语句,因为很明显 CSV 啥也不会给出。 如果有一些工具可以同时连接到 SQL Server 和 MySQL,那就更好了。 您会丢失视图、存储过程、触发器等,但是将一个只使用基类型的表从一个 DB 复制到另一个 DB 并不难,对吗? 有人知道这种工具吗? 只要它支持整数、浮点数、日期时间和字符串,我不介意它做了多少假设或进行了哪些简化。 我不得不做很多修改,无论如何,我需要初始数据集!
mysql执行存储过程时自动停止
DELIMITER $$ DROP PROCEDURE IF EXISTS generatorDataCopy $$ CREATE PROCEDURE generatorDataCopy(inpid VARCHAR(50),OUT msg VARCHAR(50)) BEGIN DECLARE err INT DEFAULT 0; -- 如果出现sql异常,则将err设置为1后继续执行后面的操作 DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET err=1; -- 出错处理 SET autocommit = 0; START TRANSACTION; INSERT INTO tbl_outhosroom_sendchdom(SCID,PLID,MEID,ECIPUCODE,OUTUCODE,AMOUNT,CURRENTINHOSMARK,DOSE,DOSEUNIT,ECIPEOPERATEDATE,PAYMONEY,UNITPRICE,OUTTIME) SELECT DISTINCT rec.SCID,rec.PLID,rec.MEID,rec.ECIPUCODE,rec.OUTUCODE,rec.AMOUNT,rec.CURRENTINHOSMARK,rec.DOSE,rec.DOSEUNIT,rec.ECIPEOPERATEDATE,rec.PAYMONEY,rec.UNITPRICE,rec.OUTTIME FROM tbl_room_sendchdom rec LEFT JOIN tbl_inhos_medord_exec exec ON rec.meid = exec.meid LEFT JOIN tbl_inhos_medord med ON exec.medordid = med.medordid WHERE med.pid=inpid; INSERT INTO tbl_outhosroom_recedechdom(RCID,SCID,MEID,PLID,UCODE,OPERUCODE,AMOUNT,CURRENTINHOSMARK,DOSE,DOSEUNIT,PAYMONEY,UNITPRICE,OUTTIME) SELECT DISTINCT rec.RCID,rec.SCID,rec.MEID,rec.PLID,rec.UCODE,rec.OPERUCODE,rec.AMOUNT,rec.CURRENTINHOSMARK,rec.DOSE,rec.DOSEUNIT,rec.PAYMONEY,rec.UNITPRICE,rec.OUTTIME FROM tbl_room_recedechdom rec LEFT JOIN tbl_room_sendchdom send ON rec.scid = send.scid LEFT JOIN tbl_inhos_medord_exec exec ON send.meid = exec.meid LEFT JOIN tbl_inhos_medord med ON exec.medordid = med.medordid WHERE med.pid=inpid; 下面是若干条insert语句...... DELETE rec FROM tbl_inhos_refund_record rec LEFT JOIN tbl_inhos_medord_exec exec ON rec.meid = exec.meid LEFT JOIN tbl_inhos_medord med ON exec.medordid = med.medordid WHERE med.pid=inpid; DELETE melist FROM tbl_inhos_medord_list melist LEFT JOIN tbl_inhos_medord med ON melist.medordid = med.medordid WHERE med.pid=inpid; 下面是若干条delete语句...... IF err=1 THEN ROLLBACK; SET msg = 'fail'; ELSE COMMIT; SET msg = 'succ'; END IF; END$$ DELIMITER ; 这是一个数据搬移的存储过程,因为涉及的表比较多,每个人的数据只能通过人的主键去关联的搬移相应的数据。有些表的数据量比较大,所以在连连续搬移的时候就会出现错误码:2013这个错误。我想问的是需要调整那些参数能解决这个问题啊?
springboot 配置多库之后,mybatis在控制台不打印sql语句了
springboot项目 单库下,mybatis只需要添加如下配置,就可以打印sql语句 ```xml <!-- 打印查询语句 --> <setting name="logImpl" value="STDOUT_LOGGING" /> ``` 但是多库环境下,mybatis不论怎么设置,都无法打印sql语句..... ---- ---- 项目中的相关配置: mybatis配置: ```xml <!-- 设置运行参数 --> <settings> <!-- 全局映射器启用缓存 --> <setting name="cacheEnabled" value="true" /> <!-- 查询时,关闭关联对象及时加载以提高性能 --> <setting name="lazyLoadingEnabled" value="false" /> <!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指定),不会加载关联表的所有字段,以提高性能 --> <setting name="aggressiveLazyLoading" value="false" /> <!-- 对于位置的SQL查询,允许返回不同的结果集以达到通用的效果 --> <setting name="multipleResultSetsEnabled" value="true" /> <!-- 允许使用列标签代替列明 --> <setting name="useColumnLabel" value="true" /> <!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值), 数据表的pk生成策略将被覆盖 --> <setting name="useGeneratedKeys" value="true" /> <!-- 给予被嵌套的resultMap以字段-属性的映射支持 --> <setting name="autoMappingBehavior" value="PARTIAL" /> <!-- 对于批量更新操作缓存SQL以提高性能 --> <setting name="defaultExecutorType" value="REUSE" /> <!-- 数据库超过25000秒仍未响应则超时 --> <!--<setting name="defaultStatementTimeout" value="25000" />--> <!-- 打印查询语句 --> <setting name="logImpl" value="STDOUT_LOGGING" /> <!-- 开启驼峰--> <setting name="mapUnderscoreToCamelCase" value="true" /> </settings> ``` logback配置: ```xml <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true"> <!-- 属性1:每个logger都关联到logger上下文,默认上下文名称为“default”。 但可以使用设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改,可以通过%contextName来打印日志上下文名称。 --> <contextName>logback</contextName> <!--属性2:定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径--> <!-- <springProfile name="dev"> <property name="LOG_PATH" value="D://care-management-statisticserver-logs"/> </springProfile> <springProfile name="test"> <property name="LOG_PATH" value="/data/tomcat_jar/taixin_care/care-management-statisticserver/logs"/> </springProfile> <springProfile name="prod"> <property name="LOG_PATH" value="/data1/logs/care-management-statisticserver"/> </springProfile> --> <property name="LOG_PATH" value="${LOG_FILE}"/> <!--appender用来格式化日志输出节点,有俩个属性name和class,class用来指定哪种输出策略,常用就是控制台输出策略和文件输出策略。--> <!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,,,, --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>info</level> </filter> <encoder> <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n</pattern> </encoder> </appender> <!--<include resource="org/springframework/boot/logging/logback/base.xml"/>--> <!-- 说明: 1、日志级别及文件 日志记录采用分级记录,级别与日志文件名相对应,不同级别的日志信息记录到不同的日志文件中 例如:error级别记录到log_error_xxx.log或log_error.log(该文件为当前记录的日志文件),而log_error_xxx.log为归档日志, 日志文件按日期记录,同一天内,若日志文件大小等于或大于2M,则按0、1、2...顺序分别命名 例如log-level-2013-12-21.0.log 其它级别的日志也是如此。 2、文件路径 若开发、测试用,在Eclipse中运行项目,则到Eclipse的安装路径查找logs文件夹,以相对路径../logs。 若部署到Tomcat下,则在Tomcat下的logs文件中 3、Appender FILEERROR对应error级别,文件名以log-error-xxx.log形式命名 FILEWARN对应warn级别,文件名以log-warn-xxx.log形式命名 FILEINFO对应info级别,文件名以log-info-xxx.log形式命名 FILEDEBUG对应debug级别,文件名以log-debug-xxx.log形式命名 CONSOLE将日志信息输出到控制上,为方便开发测试使用 --> <!-- 日志记录器,日期滚动记录 --> <appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文件的路径及文件名 --> <file>${LOG_PATH}/error_statisticserver.log</file> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。 而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 --> <fileNamePattern>${LOG_PATH}/error-statisticserver-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 表示只保留最近30天的日志,以防止日志填满整个磁盘空间。--> <maxHistory>30</maxHistory> <!--用来指定日志文件的上限大小,例如设置为1GB的话,那么到了这个值,就会删除旧的日志。--> <totalSizeCap>1GB</totalSizeCap> <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始, 命名日志文件,例如log-error-2013-12-21.0.log --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!-- 追加方式记录日志 --> <append>true</append> <!-- 日志文件的格式 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n</pattern> <charset>utf-8</charset> </encoder> <!-- 此日志文件只记录error级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 日志记录器,日期滚动记录 --> <appender name="FILEINFO" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文件的路径及文件名 --> <file>${LOG_PATH}/info_statisticserver.log</file> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。 而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 --> <fileNamePattern>${LOG_PATH}/info-statisticserver-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 表示只保留最近30天的日志,以防止日志填满整个磁盘空间。--> <maxHistory>30</maxHistory> <!--用来指定日志文件的上限大小,例如设置为1GB的话,那么到了这个值,就会删除旧的日志。--> <totalSizeCap>1GB</totalSizeCap> <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,命名日志文件,例如log-error-2013-12-21.0.log --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!-- 追加方式记录日志 --> <append>true</append> <!-- 日志文件的格式 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n</pattern> <charset>utf-8</charset> </encoder> <!-- 此日志文件只记录info级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- <logger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。<logger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。 --> <logger name="org.springframework" level="INFO"/> <logger name="org.apache" level="ERROR"/> <logger name="org.hibernate.validator" level="ERROR"/> <!--<logger name="org.thymeleaf" level="ERROR"/>--> <logger name="org.springframework.context.annotation" level="ERROR"/> <!-- springProfile多环境日志输出,据不同环境(prod:生产环境,test:测试环境,dev:开发环境)来定义不同的日志输出--> <springProfile name="dev" /> <root level="INFO"> <appender-ref ref="FILEERROR"/> <appender-ref ref="FILEINFO"/> <appender-ref ref="STDOUT"/> </root> <!-- 可以启动服务的时候指定 profile (如不指定使用默认),如指定prod 的方式为: java -jar xxx.jar –spring.profiles.active=prod--> </configuration> ``` application.properties部分配置: ```properties #配置文件 logging.level.tk.mybatis=TRACE spring.freemarker.cache=false spring.freemarker.request-context-attribute=request mybatis.type-aliases-package=com.mtpf.domain mybatis.mapper-locations=classpath:mapper/*.xml mapper.mappers=com.mtpf.util.MyMapper mapper.not-empty=false mapper.identity=MYSQL pagehelper.helperDialect=mysql #true 是超出最大页码返回数据 false超出最大页码不返回数据 pagehelper.reasonable=${PAGEHELPER_REASONABLE} pagehelper.supportMethodsArguments=true pagehelper.params=count=countSql ```
实时大数据写入数据库
项目:IOCP的多线程(工作线程)解析大量客户端发送过来的数据;这个数据量是非常大的,上千个客户端,每50MS发送一个数据包过来,要把他们写入数据库。以下是我做的两种设计,均不能成功。 1.简单地通过程序一条一条地执行SQL语句写入数据库,失败,效率极低,淘汰。 2.我目前的处理是把这个SQL语句做一个拼接(...+SQL语句+;+SQL 语句+;+...),然后一并执行,写入数据库,但是这么设计的话,内存会一直涨,因为写入数据库的速率小于IOCP解析出来的数据所形成的SQL语句,它是占内存。 需解决的问题如下: 在不做分布式数据库设计的情况,有什么高性能的写数据库的方法, 我是用的数据库是SQL server 2008 ,用VC++ 实现,因为C#的话,微软封装了相应的类。求高手指教
SQL语句编写求助,两张表联合查询
有两张表如图 ![两张表](https://img-ask.csdn.net/upload/201709/29/1506653651_469431.jpg) 想根据B.Name in ('张三','李四') 来获取 8条数据 如图![数据结果](https://img-ask.csdn.net/upload/201709/29/1506653729_117518.jpg) A表复合主键 ID+Vaule B表主键Name A.ID=B.ID 简单说来就是 取出B表同一个ID下 小于Value 的最大数据 和大于Value的最小数据 当B.Value处于 0或者max的时候只取出 一条(满足条件)即可 不限制 sql或者存储过程... 只需得到结果 这个问题我已经思考很久了, 并非一点sql 都不会 万望回答的朋友三思 ---------------------------------------------------------分割线 以下内容为测试用建表sql以及数据 CREATE TABLE B( [Name] [nvarchar](50) NOT NULL, [ID] [int] NOT NULL, [Value] [int] NOT NULL , [KEY] [int] NULL, CONSTRAINT [PK_BAS_B] PRIMARY KEY CLUSTERED ( [Name] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] INSERT INTO B ([Name] ,[ID] ,[Value] ,[KEY]) VALUES('张三' ,1 ,27 ,1) INSERT INTO B ([Name] ,[ID] ,[Value] ,[KEY]) VALUES('张三' ,2 ,37 ,2) INSERT INTO B ([Name] ,[ID] ,[Value] ,[KEY]) VALUES('李四' ,1 ,20 ,3) INSERT INTO B ([Name] ,[ID] ,[Value] ,[KEY]) VALUES('李四' ,2 ,40 ,4) CREATE TABLE A( [ID] [int] NOT NULL, [Value] [int] NOT NULL , [TYPE] [int] NULL, [NAME] [nvarchar](10) NULL, CONSTRAINT [PK_BAS_A] PRIMARY KEY CLUSTERED ( [ID] ASC, [Value] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] INSERT INTO A([ID],[Value],[TYPE],[NAME]) VALUES (1,5,1,'test') INSERT INTO A([ID],[Value],[TYPE],[NAME]) VALUES (1,10,1,'test') INSERT INTO A([ID],[Value],[TYPE],[NAME]) VALUES (1,15,1,'test') INSERT INTO A([ID],[Value],[TYPE],[NAME]) VALUES (1,20,1,'test') INSERT INTO A([ID],[Value],[TYPE],[NAME]) VALUES (1,25,1,'test') INSERT INTO A([ID],[Value],[TYPE],[NAME]) VALUES (1,30,1,'test') INSERT INTO A([ID],[Value],[TYPE],[NAME]) VALUES (1,35,1,'test') INSERT INTO A([ID],[Value],[TYPE],[NAME]) VALUES (1,40,1,'test') INSERT INTO A([ID],[Value],[TYPE],[NAME]) VALUES (1,45,1,'test') INSERT INTO A([ID],[Value],[TYPE],[NAME]) VALUES (1,50,1,'test') INSERT INTO A([ID],[Value],[TYPE],[NAME]) VALUES (2,5,2,'test') INSERT INTO A([ID],[Value],[TYPE],[NAME]) VALUES (2,10,2,'test') INSERT INTO A([ID],[Value],[TYPE],[NAME]) VALUES (2,15,2,'test') INSERT INTO A([ID],[Value],[TYPE],[NAME]) VALUES (2,20,2,'test') INSERT INTO A([ID],[Value],[TYPE],[NAME]) VALUES (2,25,2,'test') INSERT INTO A([ID],[Value],[TYPE],[NAME]) VALUES (2,30,2,'test') INSERT INTO A([ID],[Value],[TYPE],[NAME]) VALUES (2,35,2,'test') INSERT INTO A([ID],[Value],[TYPE],[NAME]) VALUES (2,40,2,'test') INSERT INTO A([ID],[Value],[TYPE],[NAME]) VALUES (2,45,2,'test') INSERT INTO A([ID],[Value],[TYPE],[NAME]) VALUES (2,50,2,'test')
请问诸如k-means等大数据分析,在spark上的读取机制以及如何进行存储部署的?
一个问题是,spark在读取数据的时候,是逐条读入内存,还是分块读入,或者是一口气全部读入内存的?另一个问题是,如果数据保存在sql数据库中,那么所需要读取的数据,是直接通过SparkContext绑定sql地址和语句,通过网络传输;还是提前从sql中生成excel文件,放到spark服务器的文件夹中进行处理?
ORA-03001:未实施的功能 和 ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值
我现在一个存储过程中报错“ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值”,我怀疑是clob限制的问题,但是做实验时遇到下面的错误 我是写了一个很简单的存储过程,准备验证普通表中clob字段存储有没有大小限制,查资料好像说最大4G,我想验证一下。但是写存储过程将大量数据插入clob字段时报标题错误: 版本: SQL> select * from v$version; BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod PL/SQL Release 10.2.0.1.0 - Production CORE 10.2.0.1.0 Production TNS for 32-bit Windows: Version 10.2.0.1.0 - Production NLSRTL Version 10.2.0.1.0 - Production 语句: 建表: create table t_wll_clob(mobile clob); 建存储过程: create or replace procedure p_wll_clob as v_clob clob; begin for v_11 in(select allcode from T_BUSI_MAIN_PRESEND3 where main1status='0') loop --allcode字段为clob类型,存储的是用逗号分隔的手机号码。for一共500条记录,每条200个用逗号分隔的手机号 v_clob := v_11.allcode||','||v_clob; end loop; insert into t_wll_clob(mobile) values v_clob; end ; 报错: insert into t_wll_clob(mobile) values v_clob; ORA-03001:未实施的功能 求高手解答。 另外我想知道: 1.普通表中clob字段最大限制是多少 2.存储过程中clob变量最大限制是多少 3.如果clob有限制,那么超过限制报错一般是怎么解决,是限制数据的大小还是?
Oracle中如何对多个字段的值进行判断并计数
数据库中根据业务表创建了视图,存储有SSRQ1-6、SSJB1-6共12个字段,同时新增了四个字段S1-S4用来存储SSJB1-6中对应数值的计数 ![图片说明](https://img-ask.csdn.net/upload/201910/28/1572247312_74401.png) 业务场景为: 每一条数据表示一个个案,需要统计每个个案中各级别手术的个数 业务需求是: 当SSRQ1-6中任意两个字段有相同值时,取SSJB1-6中数值最大的,在对应的级别下计数+1; 当SSRQ1-6中存在不同值时,每个对应的SJJB都需要取,在对应的级别下计数+1 例如: ![图片说明](https://img-ask.csdn.net/upload/201910/28/1572247518_459812.png) 28日有二级/三级手术,取三级手术,S3下计数+1; 29日有一级/二级手术,取二级手术,S2下计数+1; 14日有四级手术,S4下计数+1; 汇总后该条个案对应的S1-S4分别为0/1/1/1 求问大神这样用sql语句怎么实现 case when 和decode都试过了
问大家一个 memcached 缓存策略
问题是这样的: 我有一个 IP 地址库(里面有近 40万 条IP地址记录),表结构是这样的: [color=darkred] id —— 主键,自增长 fromip —— ip地址段的开始值(long型的-将ip地址转换成long型存入的) toip —— ip地址段的结束值(long型的) unit —— 该ip段分配给的单位名称[/color] 我主要的任务就是:查询一个IP地址在哪个IP地址段范围内,并给出其分配的单位名称。 SQL语句类似这样([color=darkblue]976362050 ——是一个IP地址的long型值[/color]): [color=darkred]select unit from ipglobe where fromip < 976362050 and toip > 976362050[/color] 因为要大量查询一些IP地址在哪个IP地址段范围内,所以如果每次都从数据库近40万条记录中检索,速度很慢。 于是就想采用 memcached 缓存策略,但是想了好几天,也没有想到该如何缓存这些数据? 曾经想到这样一个方法: [color=darkblue]将近40万记录以 key = "fromip#toip" value="unit" 形式存放,然后遍历所有的 key ,取key分离出fromip和toip,然后判断给的IP值是否在该key的范围内。[/color] 但是后来发现遍历memcached中所有的 key 是不行的,所以想请教一下该怎么设计存储策略?? (我用的是 Java 语言)
PreparedStatement 预编译原理
<p><strong><span>preparedStatement 有三大优点:</span></strong></p> <p><span><span>一.代码的可读性和可维护性. </span></span></p> <p><span><span>二.PreparedStatement尽最大可能提高性能. </span></span></p> <p><span><span>三.最重要的一点是极大地提高了安全性. </span></span></p> <p> </p> <p><span><span>其中一和三的确很易理解。 关于性能的提高也是最有价值的这点, 我对其原理还有些质疑。 </span></span></p> <p> </p> <p> </p> <div class="quote_title">网上一:</div> <div class="quote_div">SQL 语句被预编译并且存储在 PreparedStatement 对象中,其后可以使用该对象高效地多次执行该语句。 <br> </div> <p><span style="color: #ff0000;">问题:</span>预编译在JDBC中完成的?还是数据库中?即便存在preparedStatement中,如果这个preparedStatement 对象不被缓存起来,其后又如何重复使用,多次执行? (一些webserver会缓存preparedStatement)</p> <p>我想关于其性能的提高主要得需要数据库的支持。 </p> <div class="quote_title">oracle 性能优化 写道</div> <div class="quote_div">共享SQL语句 <br>  为了不重复解析相同的SQL语句,在第一次解析之后, ORACLE将SQL语句存放在内存中。 <br>可惜的是ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询。 <br> </div> <p><span><span><span><span><span><span style="font-size: x-small;"><span style="color: #008000;">个人理解:</span>预编译是利用数据库的SQL共享来实现的,因为当使用preparedStatement 的时候,尽管参数不同,但是在语句中用?来替代。 因此很多语句就完全相同。(这个道理和J2EE的server缓存preparedStatement 的道理应该是一样的)</span></span></span></span></span></span></p> <p> </p> <p><span><span><span><span><span><span><span style="font-size: x-small;"><span style="color: #ff0000;">问题:</span>但是如果是这样的话,那么oracle的多表查询岂不是并无预编译效果?</span></span></span></span></span></span></span></p> <p> </p> <p><span><span><span><span><span><span style="font-size: x-small;"><span><span><span><span><span><span><span style="color: #ff0000;">问题:</span></span></span></span></span></span></span>关于缓存:是否根据创建preparedStatement的语句来做为Key来map的?例如以下:是否检查匹配insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)来确定是否用已经有的执行路径来执行? </span></span></span></span></span></span></p> <p><span><span><span><span style="font-size: x-small;"><span>perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)"); </span></span></span></span></span></p> <p><span> </span></p> <p><span><strong>以下几篇从网络上搜索到的三篇文章:</strong></span></p> <p><span> </span></p> <div class="quote_title"><span>CSDN 写道</span></div> <div class="quote_div"><span>一.代码的可读性和可维护性. <br>虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次: <br><br>stmt.executeUpdate("insert into tb_name (col1,col2,col2,col4) values ('"+var1+"','"+var2+"',"+var3+",'"+var4+"')"); <br><br>perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)"); <br>perstmt.setString(1,var1); <br>perstmt.setString(2,var2); <br>perstmt.setString(3,var3); <br>perstmt.setString(4,var4); <br>perstmt.executeUpdate(); <br><br>不用我多说,对于第一种方法.别说其他人去读你的代码,就是你自己过一段时间再去读,都会觉得伤心. <br><br>二.PreparedStatement尽最大可能提高性能. <br>每一种数据库都会尽最大努力对预编译语句提供最大的性能优化.因为预编译语句有可能被重复调用.所以语句在被DB的编译器编译后的执行代码被缓存下来,那么下次调用时只要是相同的预编译语句就不需要编译,只要将参数直接传入编译过的语句执行代码中(相当于一个涵数)就会得到执行.这并不是说只有一个Connection中多次执行的预编译语句被缓存,而是<span style="color: #0000ff;">对于整个DB中,只要预编译的语句语法和缓存中匹配.那么在任何时候就可以不需要再次编译而可以直接执行.而statement的语句中,即使是相同一操作,而由于每次操作的数据不同所以使整个语句相匹配的机会极小,几乎不太可能匹配.</span>比如: <br>insert into tb_name (col1,col2) values ('11','22'); <br>insert into tb_name (col1,col2) values ('11','23'); <br>即使是相同操作但因为数据内容不一样,所以整个个语句本身不能匹配,没有缓存语句的意义.事实是没有数据库会对普通语句编译后的执行代码缓存.这样每执行一次都要对传入的语句编译一次. <br><br>当然并不是所以预编译语句都一定会被缓存,数据库本身会用一种策略,比如使用频度等因素来决定什么时候不再缓存已有的预编译结果.以保存有更多的空间存储新的预编译语句. <br><br>三.最重要的一点是极大地提高了安全性. <br><br>即使到目前为止,仍有一些人连基本的恶义SQL语法都不知道. <br>String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'"; <br>如果我们把[' or '1' = '1]作为varpasswd传入进来.用户名随意,看看会成为什么? <br><br>select * from tb_name = '随意' and passwd = '' or '1' = '1'; <br>因为'1'='1'肯定成立,所以可以任何通过验证.更有甚者: <br>把[';drop table tb_name;]作为varpasswd传入进来,则: <br>select * from tb_name = '随意' and passwd = '';drop table tb_name;有些数据库是不会让你成功的,但也有很多数据库就可以使这些语句得到执行. <br><br>而如果你使用预编译语句.你传入的任何内容就不会和原来的语句发生任何匹配的关系.(前提是数据库本身支持预编译,但上前可能没有什么服务端数据库不支持编译了,只有少数的桌面数据库,就是直接文件访问的那些)只要全使用预编译语句,你就用不着对传入的数据做任何过虑.而如果使用普通的statement,有可能要对drop,;等做费尽心机的判断和过虑. </span></div> <p><span> </span></p> <p> </p> <div class="quote_title"><span>论坛 写道</span></div> <div class="quote_div"> <span><span style="font-size: x-small;">1,执行效率:Statement 采取直接编译 SQL 语句的方式,扔给数据库去执行,而 </span></span><span><span><span style="font-size: x-small;"><span style="color: #0000ff;">PreparedStatement 则先将 SQL 语句预编译</span>一遍,再填充参数,这样效率会高一些。JDK 文档说:SQL 语句被预编译并且存储在 PreparedStatement 对象中,其后可以使用该对象高效地多次执行该语句。 <br><br>2,代码可读性:Statement 中 SQL 语句中需要 Java 中的变量,加就得进行字符串的运算,还需要考虑一些引号、单引号的问题,参数变量越多,代码就越难看,而且会被单引号、双引号搞疯掉;而 PreparedStatement,则不需要这样,参数可以采用“?”占位符代替,接下来再进行参数的填充,这样利于代码的可读性,并且符合面向对象的思想。 <br><br>3,安全性:Statement 由于可能需要采取字符串与变量的拼接,很容易进行 SQL 注入攻击,而 PreparedStatement 由于是预 <br>编译,再填充参数的,不存在 SQL 注入问题。 <br></span></span></span> </div> <p><span> </span></p> <div class="quote_title"><span>Oracle 优化 写道</span></div> <div class="quote_div"><span>3. 共享SQL语句 <br>  为了不重复解析相同的SQL语句,在第一次解析之后, ORACLE将SQL语句存放在内存中。这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享。 因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的执行路径。 ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用。 <br><br>  可惜的是ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询。 </span></div><br /><strong>问题补充:</strong><br />感谢geeksun的回答,我的理解是: <br />问题1, PreparedStatement是jdbc 驱动包里的一个类,并不是说存储在jdbc中。 <br />问题2, 我认为多表查询不支持预编这是不可能的。 <br />问题3, 我想这样提问可能更好一些。 <br />java 方法如下: <br />protected boolean updateSalary(Connection conn,BigDecimal x,String ID) throws SQLException{ <br /> PreparedStatement pstmt = null; <br /> try { <br /> pstmt = conn.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?"); <br /> pstmt.setBigDecimal(1, x); <br /> pstmt.setString(2, ID); <br /> return true; <br /> } finally{ <br /> if (pstmt!=null){ <br /> pstmt.close(); <br /> } <br /> } <br /> <br /> } <br /> <br /> <br />第一次调用以后,是否会缓存PreparedStatement, 这个在用weblogic这种server的时候是可以肯定的。因为从数据源的来connection是一个包装类,不是jdbc驱动的connection,而用connection来创建的PreparedStatement也是封装类。因此尽管pstmt.close().但是实际被封装的PreparedStatement并未关闭。 <br />但是是第二次调用这个方法,会重新conn.prepareStatement, 这个时候我想应该是根据语句来作为key来寻找缓存的preparedStatement,但是尽管取到缓存。 如果没有Database的配合,效率也很难提高多少。 <br /><strong>问题补充:</strong><br />谢谢geeksun的帮忙,Sql的共享我想肯定是支持多表的。 至于高速缓存应该讲的是结果的缓存。 <br />但是你对PreparedStatement的观点我认为是不对的。 因为这个对象肯定是在WebServer端的, 不可能跑到数据库那端。K-V对应的K值应该就是创建这个对象的那条语句,只是需要一个精通人士的肯定。
ORM框架选择问题
我司有一套C/S系统,现在想用java开发一套web系统出来(后台数据库用原来的),现在对ORM框架选择上有点头痛,情况如下: 由于后能数据库不变用原来的,问题是由于后能经过了多个人架构,主键风格各异, 1。每个表有一个id自增量作为主键,但在一对多的主子表关系中,子表的关联字段有的是用主表的id,有的是用一个人工自定义主键,如销售单明细表中的关联字段是销售单主表的销售单号,有些规范的用的是销售单主表的id, 2。再比方我有员工档案表用到了部门信息表,在后台设计时可能设计成nDeptId(部门信息表的id自增列),有可能设计成vDeptNo(部门信息表人工定义的部门编号). 现在我们C/S模式开发,偏向于写sql语句及后台存储过程,关联出结果集在前台加工好后save到后台,很方便,虽然没有面向对象的思想,类似于.Net中的SqlAdapter,DataSet,取回数据加工然后insert,updata,delete, 请问应该选用哪种ORM框架呢? Hibernate还是myBatis,还是有其更好的框架? 另:我们的后台某些表(如条码表)数据量会很大。
从数据库读取字节数组的问题。
从Oracle数据库读取Long Raw列里面存储的图片。发现读取到的字节数组长度为0,而那条Select语句,却可以在Oracle SQL Developer 里面查找到一大串字符串。。。。。。。很长很长的字符串。以前往Oracle里面存MP3,然后取出来。也是可以创建MP3文件,但是文件长度为0,估计也是这个因为从Oracle里面取出来的二进制字节数组,长度为0的原因。 求解答: 1.为什么取出来的字节数组长度为0,而我数据库里面明明有数据,SQL语句又没有问题。 2.怎么解决这个问题。 我的部分代码如下图。 ![图片](https://img-ask.csdn.net/upload/201508/05/1438746198_43801.jpg)
数据表和类的关系,希望大牛指点一下
我在学习java操作数据库的时候,有一点很是不明白,我在java代码中可以使用sql语句对数据表进行增删改,为什么在查询的时候,需要建立一个数据表对应的javabean类,再把类存储到集合中呢???
pdo封装数据库类的时候报了这样一条错误。
![图片说明](https://img-ask.csdn.net/upload/201507/23/1437630595_296662.png) 说不是这个对象的成员函数,求大牛解惑 ``` <?php header("Content-type:text/html;charset=utf8"); class pdoMysql{ public static $configAll = array(); //存储配置信息 public static $link = null; //存储连接对象 public static $pconnect = false;//在数据库连接的时候,第四个参数,是否开启长链接,默认为不开启 public static $dbVersion = null;//存储数据库版本号 public static $connect = false;//判断是否链接成功 public static $pdoStmt = null;//存储PDO预处理对象 public static $querySql = null;//query 保存最后一次执行操作 public function __construct($config=""){ if(!class_exists("PDO")){ self::throw_error("不支持PDO,请先开启"); } if(!is_array($config)){ $config=array( 'hostname' => DB_HOST, 'username' => DB_USER, 'password' => DB_PASS, 'datebase' => DB_NAME, 'hostport' => DB_PORT, 'hosttype' => DB_TYPE, 'dsn' => DB_TYPE.":host=".DB_HOST.";dbname=".DB_NAME, ); } /*判断主机名是否为空*/ if(empty($config['hostname'])){self::throw_error('没有定义数据库的配置,请先定义');} self::$configAll = $config; /*数据库连接属性*/ if(empty(self::$configAll['parm'])){self::$configAll['parm'] = array();} /*将数据库连接对象保存在$link中*/ if(isset(self::$link)){ $configs = self::$configAll; if(self::$pconnect){ //开启长连接 $configs['parm'][constant("PDO::ATTR_PERSISTENT")] = true; } try{ self:$link = new PDO($configs['dsn'],$configs['username'],$configs['password'],$configs['parm']); }catch(PDOException $e){ self::throw_error($e->getMessage()); } if(!self::$link){ self::throw_error('PDO链接失败'); return false; } /*定义字符编码*/ self::$link->exec("SET NAMES ".DB_CHARSET); /*定义数据库版本号*/ self::$dbVersion = self::$link->getAttribute(constant("PDO::ATTR_SERVER_VERSION")); /*定义链接成功*/ self::$connect = true; unset($configs); } } /*定义释放结果集*/ public static function free(){ self::$pdoStmt = null; } /*定义QUERY操作*/ public static function query($sql=null){ $link = self::$link; if(!$link) {return false;} //判断之前是否有结果集,如果有那么就先释放下结果集 if(!empty(self::$pdoStmt)){self::free();} self::$querySql = $sql; //准备SQL语句 self::$pdoStmt = $link->prepare(self::$querySql); $res = self::$pdoStmt->execute(); //有错误的话执行下haveError()方法;没错误跳过此句 self::haveError(); return $res; } /*得到所有记录*/ public static function selectAll($sql=null){ if($sql != null){ self::query($sql); } $result = self::$pdoStmt->fetchAll(constant("PDO::FETCH_ASSOC")); return $result; } /*错误提示*/ public static function haveError(){ $obj = empty(self::$pdoStmt)?self::$link: self::$pdoStmt; $arrObj = $obj->errorInfo(); print_r($arrObj); } /*自定义异常信息*/ public static function throw_error($errorMess){ echo <<<EOF <div style="width:100%;height:150px;background:#000;color:#fff;">{$errorMess}</div> EOF; } } require_once('config.php'); $pdoMysql = new pdoMysql; // var_dump($pdoMysql); $sql = "SELECT * FROM text"; print_r($pdoMysql->selectAll($sql)); ?> ```
关于字符编码的问题。。。。。。
最近在做学习的工程训练遇到一个问题 数据库中的数据用中文存储没有问题 用的是nvarchar 支持unicode 而c#中的string 据说默认也是unicode的 从数据库中传出数据中文是正常的,而从程序中将数据传入数据库则中文出现乱码 后来在一个帖子中看到了一种做法将程序中使用的sql语句字符串前加N 我试了一下 确实没有问题了 然后我又百度了一下加N究竟起的啥作用 CSDN博客  dxnn520 Sql Server字符串前面加上的作用! 发表于2012/6/18 11:15:10  3633人阅读 分类: 1. select N'上海长宁店' 在字符串前面加上 N 代表存入数据库时以 Unicode 格式存储。 N'string'  表示string是个Unicode字符串 Unicode 字符串的格式与普通字符串相似,但它前面有一个 N 标识符(N 代表 SQL-92 标准中的国际语言 (National Language))。N 前缀必须是大写字母。例如,'Michél' 是字符串常量而 N'Michél' 则是 Unicode 常量。Unicode 常量被解释为 Unicode 数据,并且不使用代码页进行计算。Unicode 常量确实有排序规则,主要用于控制比较和区分大小写。为 Unicode 常量指派当前数据库的默认排序规则,除非使用 COLLATE 子句为其指定了排序规则。Unicode 数据中的每个字符都使用两个字节进行存储,而字符数据中的每个字符则都使用一个字节进行存储。有关更多信息,请参见使用 Unicode 数据。 作者:Tyler Ning  出处:http://www.cnblogs.com/tylerdonet/  那么问题来了 明明string是unicode nvarchar也是unicode 那么为何还要再加N再操作一次呢
各位大牛,求助window上DB2联邦数据库包装器创建的问题
![图片说明](https://img-ask.csdn.net/upload/201704/26/1493136955_229909.png) ## # 一早提问的问题,已经解决了,原因是那个指定的库不对,版本不同不一样,遇到同样问题的朋友自己找找吧。趁悬赏还热乎,再问一个问题,能在触发器中使用联邦数据库中定义的昵称来对另一个库中的表进行操作吗?如果能怎么做?我试了试一直报错无法建立。在触发器调用存储过程,在存储过程里也不能用,是触发器对DCL的限制啊?求教!!!**** 数据库知识相当有限,求助各位,需要加什么文件吗或什么额外的配置吗? 已经执行的命令: 1.db2 update dbm cfg using FEDERATED YES 2.db2stop 3.db2start 然后想执行 CREATE WRAPPER DRDA LIBRARY 'libdb2drda.a' 就报错了: DB21034E 该命令被当作 SQL 语句来处理,因为它是无效的“命令行 SQL 处理期间,它返回: SQL10013N 未能装入指定的库 "libdb2drda.a"。 SQLSTATE=42724 求牛人相助小弟感激不尽!!!
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私...
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1...
阿里面试官问我:如何设计秒杀系统?我的回答让他比起大拇指
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图和个人联系方式,欢迎Star和指教 前言 Redis在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在Redis的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n...
面试官问我:什么是消息队列?什么场景需要他?用了会出现什么问题?
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
Android性能优化(4):UI渲染机制以及优化
文章目录1. 渲染机制分析1.1 渲染机制1.2 卡顿现象1.3 内存抖动2. 渲染优化方式2.1 过度绘制优化2.1.1 Show GPU overdraw2.1.2 Profile GPU Rendering2.2 卡顿优化2.2.1 SysTrace2.2.2 TraceView 在从Android 6.0源码的角度剖析View的绘制原理一文中,我们了解到View的绘制流程有三个步骤,即m...
微服务中的Kafka与Micronaut
今天,我们将通过Apache Kafka主题构建一些彼此异步通信的微服务。我们使用Micronaut框架,它为与Kafka集成提供专门的库。让我们简要介绍一下示例系统的体系结构。我们有四个微型服务:订单服务,行程服务,司机服务和乘客服务。这些应用程序的实现非常简单。它们都有内存存储,并连接到同一个Kafka实例。 我们系统的主要目标是为客户安排行程。订单服务应用程序还充当网关。它接收来自客户的请求...
致 Python 初学者们!
作者| 许向武 责编 | 屠敏 出品 | CSDN 博客 前言 在 Python 进阶的过程中,相信很多同学应该大致上学习了很多 Python 的基础知识,也正在努力成长。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 Python 这门编程语言,从2009年开始单一使用 Python 应对所有的开发工作,直至今...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观...
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外...
字节跳动面试官这样问消息队列:分布式事务、重复消费、顺序消费,我整理了一下
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式和人才交流群,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip installselenium -ihttps://pypi.tuna.tsinghua.edu.cn/simple/ ...
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca...
SpringBoot2.x系列教程(三十六)SpringBoot之Tomcat配置
Spring Boot默认内嵌的Tomcat为Servlet容器,关于Tomcat的所有属性都在ServerProperties配置类中。同时,也可以实现一些接口来自定义内嵌Servlet容器和内嵌Tomcat等的配置。 关于此配置,网络上有大量的资料,但都是基于SpringBoot1.5.x版本,并不适合当前最新版本。本文将带大家了解一下最新版本的使用。 ServerProperties的部分源...
Python绘图,圣诞树,花,爱心 | Turtle篇
每周每日,分享Python实战代码,入门资料,进阶资料,基础语法,爬虫,数据分析,web网站,机器学习,深度学习等等。 公众号回复【进群】沟通交流吧,QQ扫码进群学习吧 微信群 QQ群 1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle()...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o...
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ...... ...
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
2020年全新Java学习路线图,含配套视频,学完即为中级Java程序员!!
新的一年来临,突如其来的疫情打破了平静的生活! 在家的你是否很无聊,如果无聊就来学习吧! 世上只有一种投资只赚不赔,那就是学习!!! 传智播客于2020年升级了Java学习线路图,硬核升级,免费放送! 学完你就是中级程序员,能更快一步找到工作! 一、Java基础 JavaSE基础是Java中级程序员的起点,是帮助你从小白到懂得编程的必经之路。 在Java基础板块中有6个子模块的学...
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合...
爬取薅羊毛网站百度云资源
这是疫情期间无聊做的爬虫, 去获取暂时用不上的教程 import threading import time import pandas as pd import requests import re from threading import Thread, Lock # import urllib.request as request # req=urllib.request.Requ...
如何优雅地打印一个Java对象?
你好呀,我是沉默王二,一个和黄家驹一样身高,和刘德华一样颜值的程序员。虽然已经写了十多年的 Java 代码,但仍然觉得自己是个菜鸟(请允许我惭愧一下)。 在一个月黑风高的夜晚,我思前想后,觉得再也不能这么蹉跎下去了。于是痛下决心,准备通过输出的方式倒逼输入,以此来修炼自己的内功,从而进阶成为一名真正意义上的大神。与此同时,希望这些文章能够帮助到更多的读者,让大家在学习的路上不再寂寞、空虚和冷。 ...
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名...
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计...
HTML5适合的情人节礼物有纪念日期功能
前言 利用HTML5,css,js实现爱心树 以及 纪念日期的功能 网页有播放音乐功能 以及打字倾诉感情的画面,非常适合情人节送给女朋友 具体的HTML代码 具体只要修改代码里面的男某某和女某某 文字段也可自行修改,还有代码下半部分的JS代码需要修改一下起始日期 注意月份为0~11月 也就是月份需要减一。 当然只有一部分HTML和JS代码不够运行的,文章最下面还附加了完整代码的下载地址 &lt;!...
相关热词 c#导入fbx c#中屏蔽键盘某个键 c#正态概率密度 c#和数据库登陆界面设计 c# 高斯消去法 c# codedom c#读取cad文件文本 c# 控制全局鼠标移动 c# temp 目录 bytes初始化 c#
立即提问