数据库开发使用经验大家谈。(同时,今天正值我来CSDN一个月的日子,诚意接受大家的批评,灌水有分)

pbdesigner 2001-08-06 12:42:21
使用MSSQLSERVER,我最喜欢它的Query Analyzer工具,我个人认为它与使用MMC的区别就是它是命令行的表示方式,而使用MMC是进行可视化的管理,它几乎可以做MMC能做的任何工作,而且它的帮助系统相当详尽。这是我个人的一点使用心得,希望各路英雄能谈一下自己在数据库开发使用上的经验技巧。
...全文
4961 113 打赏 收藏 转发到动态 举报
写回复
用AI写文章
113 条回复
切换为时间正序
请发表友善的回复…
发表回复
xygzh 2001-08-14
  • 打赏
  • 举报
回复
呵呵!pbdesigner是个sql高手,程序也写的规范!
fengerfeifei 2001-08-13
  • 打赏
  • 举报
回复
sql plus 吧唉
lanren_me 2001-08-13
  • 打赏
  • 举报
回复
up
pbdesigner 2001-08-13
  • 打赏
  • 举报
回复
前台用该存储过程做数据源检索数据,将自动排程结果抓出。
pbdesigner 2001-08-13
  • 打赏
  • 举报
回复
这是我原来做一个MRPII系统时写的存储过程,功能是实现自动排程。涉及表太多,流程比较复杂,只提供存储过程源代码。
CREATE PROCEDURE USP_AUTOPLAN(@MPS_NO VARCHAR(20),@PRODUCE_DEPART VARCHAR(10) = NULL,
@QTY_SCHEDULE NUMERIC(16,4) = NULL,@QTY_INTOHOUR NUMERIC(16,4) = NULL,
@START_DATE DATETIME = NULL,@END_DATE DATETIME = NULL,
@RETURN_CODE INT = 1 OUTPUT) AS
---自动排程
---@RETURN_CODE含义:1(成功);-1(工时定额未设定);-2(未设定优先生产部门);-3(无待排程数量);
--- -4(工时不够);-5(日期不在工作日历范围内),-6(物料未齐套)
DECLARE @MODEL_NO VARCHAR(60), @QTY_UNSCHEDULE NUMERIC(16,4),
@TIME_MAUN NUMERIC(16,4), @FREEHOUR NUMERIC(16,4),
@TOTAL_FREEHOUR NUMERIC(16,4), @OUT_RANGE VARCHAR(1),
@TEMP_START_DATE DATETIME, @TEMP_END_DATE DATETIME,
@DELIVERYDATE DATETIME, @ORIENT VARCHAR(1),
@TOTAL_QTY_SCHEDULE NUMERIC(16,4), @QTY_SCHEDULE_DETAIL NUMERIC(16,4),
@TOTAL_QTY_INTOHOUR NUMERIC(16,4), @QTY_INTOHOUR_DETAIL NUMERIC(16,4),
@TEMP_QTY_SCHEDULE NUMERIC(16,4), @PRODUCE_DATE DATETIME,
@COMPLETE_DATE DATETIME, @QTY_COMPLETE NUMERIC(16,4),
@MPS_FREEHOUR NUMERIC(16,4), @KC_TAG VARCHAR(1),
@QTY_COMPLETE_TEMP NUMERIC(16,4), @QTY_COMPLETE_LAST NUMERIC(16,4),
@QTY_SCHEDULE_LABOUR NUMERIC(16,4), @QTY_SCHEDULE_MATERIAL NUMERIC(16,4),
@QTY_SCHEDULE_CURRENT NUMERIC(16,4), @QTY_USEHOUR_CURRENT NUMERIC(16,4),
@QTY_SCHEDULE_WAIT NUMERIC(16,4), @QTY_COMPLETE_THIS NUMERIC(16,4),
@QTY_SCHEDULE_LAST NUMERIC(16,4), @MIN_STRING VARCHAR(255)
---ORIENT 计算方向('S':从前往后推算,'E':从后往前推算)

CREATE TABLE dbo.#TEMP_MPS_PLAN_DETAIL
(MPS_NO varchar(20) NOT NULL,
PRODUCE_DEPART VARCHAR(10) NULL,
QTY_SCHEDULE NUMERIC(16,4) NULL,
QTY_INTOHOUR NUMERIC(16,4) NULL,
START_DATE DATETIME NULL,
END_DATE DATETIME NULL,
PRODUCE_DATE DATETIME NOT NULL,
QTY_SCHEDULE_DETAIL NUMERIC(16,4) NULL,
QTY_INTOHOUR_DETAIL NUMERIC(16,4) NULL,
CONSTRAINT PK_#TEMP_MPS_PLAN_DETAIL
PRIMARY KEY NONCLUSTERED
(MPS_NO,PRODUCE_DATE))

---计划类型
SELECT @KC_TAG = KC_TAG
FROM MPS_MASTER
WHERE MPS_NO = @MPS_NO

---设置默认计算方向
SELECT @ORIENT = 'S'
SELECT @MODEL_NO = MODEL_NO,
@QTY_UNSCHEDULE = ISNULL(QTY_PLAN,0) - ISNULL(QTY_SCHEDULE,0),
@DELIVERYDATE = DELIVERYDATE
FROM MPS_MASTER
WHERE MPS_NO = @MPS_NO

---最小齐套日期
SELECT @COMPLETE_DATE = MIN(COMPLETE_DATE)
FROM MC_MATERIAL_COMPLETE
WHERE MPS_NO = @MPS_NO AND
PLAN_NO IS NULL
IF @KC_TAG <> 'R' AND (@COMPLETE_DATE IS NULL OR @COMPLETE_DATE = NULL)
BEGIN
RETURN (-6)
END
IF @KC_TAG = 'R'
BEGIN
SELECT @COMPLETE_DATE = GETDATE()
END

---最大齐套数量
SELECT @QTY_COMPLETE = MAX(QTY_COMPLETE)
FROM MC_MATERIAL_COMPLETE
WHERE MPS_NO = @MPS_NO AND
PLAN_NO IS NULL
IF @KC_TAG <> 'R' AND (@QTY_COMPLETE IS NULL OR @QTY_COMPLETE = NULL)
BEGIN
RETURN (-6)
END

SELECT @TIME_MAUN = ISNULL(TIME_MAUN,0)
FROM MODEL_MANU_TIME
WHERE MODEL_NO = @MODEL_NO
IF @KC_TAG <> 'R' AND (@TIME_MAUN IS NULL OR @TIME_MAUN = NULL OR @TIME_MAUN = 0)
BEGIN
RETURN (-1)
END

IF @PRODUCE_DEPART IS NULL OR @PRODUCE_DEPART = NULL OR @PRODUCE_DEPART = ''
---获取最优生产部门
BEGIN
SELECT @PRODUCE_DEPART = DEPARTMENT_NO
FROM MODEL_MANU_PRDDEPART_SEQ
WHERE MODEL_NO = @MODEL_NO AND
SEQ_NO = (SELECT MIN(SEQ_NO)
FROM MODEL_MANU_PRDDEPART_SEQ
WHERE MODEL_NO = @MODEL_NO)
IF @PRODUCE_DEPART IS NULL OR @PRODUCE_DEPART = NULL
BEGIN
RETURN (-2)
END
END

IF @QTY_SCHEDULE IS NULL OR @QTY_SCHEDULE = NULL OR @QTY_SCHEDULE = 0
---获取待排产数量
BEGIN
IF @QTY_UNSCHEDULE IS NULL OR @QTY_UNSCHEDULE = NULL OR @QTY_UNSCHEDULE = 0
BEGIN
RETURN (-3)
END
ELSE
BEGIN
SELECT @QTY_SCHEDULE = @QTY_UNSCHEDULE
END
END
IF @QTY_SCHEDULE > @QTY_UNSCHEDULE
BEGIN
SELECT @QTY_SCHEDULE = @QTY_UNSCHEDULE
END
IF @KC_TAG <> 'R' AND @QTY_SCHEDULE > @QTY_COMPLETE

BEGIN
SELECT @QTY_SCHEDULE = @QTY_COMPLETE
END

IF @QTY_INTOHOUR IS NULL OR @QTY_INTOHOUR = NULL OR @QTY_INTOHOUR = 0
---获取应投入工时
BEGIN
IF @KC_TAG <> 'R'
BEGIN
IF @TIME_MAUN = 0
BEGIN
SELECT @QTY_INTOHOUR = 0
END
ELSE
BEGIN
SELECT @QTY_INTOHOUR = @QTY_SCHEDULE / @TIME_MAUN
END
END
ELSE
BEGIN
SELECT @QTY_INTOHOUR = 0
END
END

IF @START_DATE <> NULL AND NOT @START_DATE IS NULL
---检查开始日期是否在工作日历范围内
BEGIN
IF NOT EXISTS(SELECT * FROM PERIOD_DATE WHERE BEGIN_DATE <= @START_DATE AND END_DATE >= @START_DATE)
BEGIN
RETURN (-5)
END
END

IF @END_DATE <> NULL AND NOT @END_DATE IS NULL
---检查结束日期是否在工作日历范围内
BEGIN
IF NOT EXISTS(SELECT * FROM PERIOD_DATE WHERE BEGIN_DATE <= @END_DATE AND END_DATE >= @END_DATE)
BEGIN
RETURN (-5)
END
END

IF @END_DATE <> NULL OR @END_DATE IS NOT NULL
---提供结束日期
BEGIN
SELECT @FREEHOUR = 0
SELECT @ORIENT = 'E'
SELECT @OUT_RANGE = 'N'
SELECT @TEMP_START_DATE = @END_DATE
SELECT @TOTAL_QTY_SCHEDULE = 0
SELECT @TOTAL_QTY_INTOHOUR = 0
SELECT @QTY_COMPLETE_LAST = 0
SELECT @QTY_SCHEDULE_WAIT = 0
SELECT @QTY_SCHEDULE_LAST = 0
WHILE (@TOTAL_QTY_SCHEDULE < @QTY_SCHEDULE AND @OUT_RANGE = 'N' )
BEGIN
---待排数量
SELECT @QTY_SCHEDULE_WAIT = @QTY_SCHEDULE - @TOTAL_QTY_SCHEDULE
---剩余工时
SELECT @FREEHOUR = ISNULL(QTY_LOCKPLANFREEHOUR,0)
FROM WORK_DATE_PLAN
WHERE GROUP_ID = @PRODUCE_DEPART AND
CONVERT(VARCHAR(10),WORKDATE,121) = CONVERT(VARCHAR(10),@TEMP_START_DATE,121)
---根据工时算出的可排产数量
SELECT @QTY_SCHEDULE_LABOUR = CEILING(@FREEHOUR * @TIME_MAUN)
---本期齐套数量
SELECT @QTY_COMPLETE_THIS = ISNULL(QTY_COMPLETE,0)
FROM MC_MATERIAL_COMPLETE
WHERE MPS_NO = @MPS_NO AND
PLAN_NO IS NULL AND
COMPLETE_DATE = (SELECT MAX(COMPLETE_DATE)
FROM MC_MATERIAL_COMPLETE
WHERE MPS_NO = @MPS_NO AND
PLAN_NO IS NULL AND
CONVERT(VARCHAR(10),COMPLETE_DATE,121) <= CONVERT(VARCHAR(10),@TEMP_START_DATE,121))
IF @QTY_COMPLETE_LAST IS NULL OR @QTY_COMPLETE_LAST = NULL OR @QTY_COMPLETE_LAST = 0
BEGIN
SELECT @QTY_COMPLETE_LAST = @QTY_COMPLETE_THIS
END
---后期齐套数量减后期排产数量等于齐套待排数量
SELECT @QTY_SCHEDULE_MATERIAL = @QTY_COMPLETE_LAST - @QTY_SCHEDULE_LAST
---取根据工时算出的可排产数量、本期齐套数量、齐套待排数量和待排产数量的最小值作为当天排产数量
SELECT @MIN_STRING = CONVERT(VARCHAR(20),@QTY_SCHEDULE_LABOUR) +','+CONVERT(VARCHAR(20),@QTY_COMPLETE_THIS)+','
+ CONVERT(VARCHAR(20),@QTY_SCHEDULE_MATERIAL)+','+CONVERT(VARCHAR(20),@QTY_SCHEDULE_WAIT)
EXECUTE USP_MIN @MIN_STRING,'N',@MIN_STRING OUTPUT

---当天排产数量
SELECT @QTY_SCHEDULE_DETAIL = CEILING(CONVERT(NUMERIC(16,4),@MIN_STRING))
---当天应占用工时
SELECT @QTY_INTOHOUR_DETAIL = @QTY_SCHEDULE_DETAIL / @TIME_MAUN
---总计排产数量
SELECT @TOTAL_QTY_SCHEDULE = @TOTAL_QTY_SCHEDULE + @QTY_SCHEDULE_DETAIL
---总计排产工时
SELECT @TOTAL_QTY_INTOHOUR = @TOTAL_QTY_INTOHOUR + @QTY_INTOHOUR_DETAIL
---后期排产数量
SELECT @QTY_SCHEDULE_LAST = @QTY_SCHEDULE_DETAIL
SELECT @START_DATE = @TEMP_START_DATE
---判断日期是否超出范围
IF NOT EXISTS(SELECT * FROM PERIOD_DATE
WHERE CONVERT(VARCHAR(10),BEGIN_DATE,121) <= CONVERT(VARCHAR(10),@TEMP_START_DATE,121) AND
CONVERT(VARCHAR(10),END_DATE,121) >= CONVERT(VARCHAR(10),@TEMP_START_DATE,121)) OR
CONVERT(VARCHAR(10),@TEMP_START_DATE ,121) < CONVERT(VARCHAR(10),GETDATE(),121) OR
CONVERT(VARCHAR(10),@TEMP_START_DATE ,121) < CONVERT(VARCHAR(10),@COMPLETE_DATE,121)
BEGIN
SELECT @OUT_RANGE = 'Y'
END
ELSE
BEGIN
SELECT @OUT_RANGE = 'N'
END
---插入到临时表
IF @QTY_SCHEDULE_DETAIL > 0
BEGIN
INSERT INTO #TEMP_MPS_PLAN_DETAIL
( MPS_NO,
PRODUCE_DEPART,
QTY_SCHEDULE,
QTY_INTOHOUR,
START_DATE,
END_DATE,
PRODUCE_DATE,
QTY_SCHEDULE_DETAIL,
QTY_INTOHOUR_DETAIL)
VALUES ( @MPS_NO,
@PRODUCE_DEPART,
@QTY_SCHEDULE,
@QTY_INTOHOUR,
@START_DATE,
@END_DATE,
@TEMP_START_DATE,
@QTY_SCHEDULE_DETAIL,
@QTY_INTOHOUR_DETAIL)
END
SELECT @TEMP_START_DATE = DATEADD(DAY,-1,@TEMP_START_DATE)
END
IF @OUT_RANGE = 'Y'
BEGIN
DELETE FROM #TEMP_MPS_PLAN_DETAIL
SELECT @START_DATE = @COMPLETE_DATE
SELECT @ORIENT = 'S'
END
END

IF @ORIENT <> 'E'
BEGIN
IF @START_DATE IS NULL OR @START_DATE = NULL
BEGIN
SELECT @START_DATE = GETDATE()
END
IF @START_DATE < @COMPLETE_DATE
BEGIN
SELECT @START_DATE = @COMPLETE_DATE
END
SELECT @FREEHOUR = 0
SELECT @OUT_RANGE = 'N'
SELECT @TEMP_END_DATE = @START_DATE
SELECT @QTY_SCHEDULE_DETAIL = 0
SELECT @QTY_INTOHOUR_DETAIL = 0
SELECT @TOTAL_QTY_SCHEDULE = 0
SELECT @TOTAL_QTY_INTOHOUR = 0
SELECT @QTY_COMPLETE_LAST = 0
WHILE @TOTAL_QTY_SCHEDULE < @QTY_SCHEDULE AND @OUT_RANGE = 'N'
BEGIN
---待排数量
SELECT @QTY_SCHEDULE_WAIT = @QTY_SCHEDULE - @TOTAL_QTY_SCHEDULE
---剩余工时
SELECT @FREEHOUR = ISNULL(QTY_LOCKPLANFREEHOUR,0)
FROM WORK_DATE_PLAN
WHERE GROUP_ID = @PRODUCE_DEPART AND
CONVERT(VARCHAR(10),WORKDATE,121) = CONVERT(VARCHAR(10),@TEMP_END_DATE,121)
---根据工时算出的可排产数量
SELECT @QTY_SCHEDULE_LABOUR = CEILING(@FREEHOUR * @TIME_MAUN)
---本期齐套数量
SELECT @QTY_COMPLETE_THIS = ISNULL(QTY_COMPLETE,0)
FROM MC_MATERIAL_COMPLETE
WHERE MPS_NO = @MPS_NO AND
PLAN_NO IS NULL AND
COMPLETE_DATE = (SELECT MAX(COMPLETE_DATE)
FROM MC_MATERIAL_COMPLETE
WHERE MPS_NO = @MPS_NO AND
PLAN_NO IS NULL AND
CONVERT(VARCHAR(10),COMPLETE_DATE,121) <= CONVERT(VARCHAR(10),@TEMP_END_DATE,121))
---后期齐套数量减已排产数量等于齐套待排数量
SELECT @QTY_SCHEDULE_MATERIAL = @QTY_COMPLETE_THIS - @TOTAL_QTY_SCHEDULE
---取根据工时算出的可排产数量、齐套待排数量和待排产数量的最小值作为当天排产数量
SELECT @MIN_STRING = CONVERT(VARCHAR(20),@QTY_SCHEDULE_LABOUR) +','
+ CONVERT(VARCHAR(20),@QTY_SCHEDULE_MATERIAL)+','+CONVERT(VARCHAR(20),@QTY_SCHEDULE_WAIT)
EXECUTE USP_MIN @MIN_STRING,'N',@MIN_STRING OUTPUT
---当天排产数量
SELECT @QTY_SCHEDULE_DETAIL = CEILING(CONVERT(NUMERIC(16,4),@MIN_STRING))
---当天应占用工时
SELECT @QTY_INTOHOUR_DETAIL = @QTY_SCHEDULE_DETAIL / @TIME_MAUN
---总计排产数量
SELECT @TOTAL_QTY_SCHEDULE = @TOTAL_QTY_SCHEDULE + @QTY_SCHEDULE_DETAIL
---总计排产工时
SELECT @TOTAL_QTY_INTOHOUR = @TOTAL_QTY_INTOHOUR + @QTY_INTOHOUR_DETAIL
---后期排产数量
SELECT @QTY_SCHEDULE_LAST = @QTY_SCHEDULE_DETAIL
SELECT @END_DATE = @TEMP_END_DATE

---判断日期是否超出范围
IF NOT EXISTS(SELECT * FROM PERIOD_DATE
WHERE CONVERT(VARCHAR(10),BEGIN_DATE,121) <= CONVERT(VARCHAR(10),@TEMP_END_DATE,121) AND
CONVERT(VARCHAR(10),END_DATE,121) >= CONVERT(VARCHAR(10),@TEMP_END_DATE,121)) OR
CONVERT(VARCHAR(10),@TEMP_END_DATE ,121) < CONVERT(VARCHAR(10),GETDATE(),121) OR

CONVERT(VARCHAR(10),@TEMP_END_DATE ,121) < CONVERT(VARCHAR(10),@COMPLETE_DATE,121)
BEGIN
SELECT @OUT_RANGE = 'Y'
END
ELSE
BEGIN
SELECT @OUT_RANGE = 'N'
END

IF @QTY_SCHEDULE_DETAIL > 0
BEGIN
---插入到临时表
INSERT INTO #TEMP_MPS_PLAN_DETAIL
( MPS_NO,
PRODUCE_DEPART,
QTY_SCHEDULE,
QTY_INTOHOUR,
START_DATE,
END_DATE,
PRODUCE_DATE,
QTY_SCHEDULE_DETAIL,
QTY_INTOHOUR_DETAIL)
VALUES ( @MPS_NO,
@PRODUCE_DEPART,
@QTY_SCHEDULE,
@QTY_INTOHOUR,
@START_DATE,
@END_DATE,
@TEMP_END_DATE,
@QTY_SCHEDULE_DETAIL,
@QTY_INTOHOUR_DETAIL)
END
SELECT @TEMP_END_DATE = DATEADD(DAY,1,@TEMP_END_DATE)
END
IF @OUT_RANGE = 'Y'
BEGIN
DELETE FROM #TEMP_MPS_PLAN_DETAIL
END
END

SELECT @START_DATE = MIN(PRODUCE_DATE),
@END_DATE = MAX(PRODUCE_DATE)
FROM #TEMP_MPS_PLAN_DETAIL
UPDATE #TEMP_MPS_PLAN_DETAIL
SET START_DATE = @START_DATE,
END_DATE = @END_DATE

SELECT MPS_NO,
PRODUCE_DEPART,
QTY_SCHEDULE,
QTY_INTOHOUR,
START_DATE,
END_DATE,
PRODUCE_DATE,
QTY_SCHEDULE_DETAIL,
QTY_INTOHOUR_DETAIL
FROM #TEMP_MPS_PLAN_DETAIL
ORDER BY MPS_NO,PRODUCE_DATE

DROP TABLE #TEMP_MPS_PLAN_DETAIL
RETURN 1





























zhuzhichao 2001-08-13
  • 打赏
  • 举报
回复
现代社会的软件开发体系结构简单概括就是N层体系结构,这里的N大于等于1。换而言之就是:单机体系(N=1)、Client/Server结构体系(N=2)、多层体系结构(N>2)。下面我们就对这几种体系结构进行简单的介绍和比较。
单机体系:这种软件适用于单机状态,一般情况下是针对某一种单一的应用,如字典软件、翻译软件等等。这种开发方式不适用于综合管理系统的开发。
C/S结构:c/s结构是在局域网上发展起来的,它具有数据集中管理的能力,在出现之初确实解决了很多计算机发展的难题,同时随着4GL语言的发展,用户的界面也比较丰富,在CLIENT端的事物处理能力也使整个系统的性能得到全面的提高,并使管理信息系统(MIS:Management Information System)得到快速的发展。其大概的图例见图1。
我们根据两层结构体系的概念来分解C/S结构的话,可以将他分为表现层(也叫表达层)和数据层。数据层提供数据存放的载体,而表现层则通过一定技术将数据层中数据取出,进行一定的分析并以某一种格式向用户进行显示。在两层体系结构中,表现层对数据库进行直接操作,且大部分的商业处理逻辑(Business Logic,数据之间的关系规则)也在表现层中实现.




图1:Client/Server 体系结构示例

三层体系结构:三层体系结构是N层体系结构的典型,所谓的三层体系结构就是将原来在两层体系结构中的商业逻辑部分从数据层和表现层中提炼出来,形成中间件服务器,所以三层就是:表现层、商业逻辑层(Business Logic)、数据层。在此之外,还有一种系统结构就是分布式系统,其结构系统图见图2。
       图2:分布式系统的结构示意图  

  在分布式系统中,其介于客户端和数据端之间的仅仅是一个应用服务器,它管理客户端的软件,但不做性能调整,比如每一个客户端调用时均产生一个新的数据库连接,而不能够将连接保持形成一个连接缓冲池。虽然在分布式应用中已经结合了一些商业处理逻辑,但是并没有真正改变原来的C/S体系结构。
在三层体系结构中,表现层将主要提供与客户的交互功能,数据层提供系统中的所有的数据保存载体,而商业逻辑层将整个系统中的商业处理逻辑整和在一起,形成中间件,在三层中。中间件起了承前启后的作用,表现层将客户端的请求通过IDL调用中间件,中间件在将其转化成数据处理原则,并从数据库中获得相应的数据,返回给客户端的软件,转换成客户要求的方式显示。关于三层体系结构的示意图见图3。
         图3:三层体系结构示意图

我们已经简单的介绍了C/S结构和三层体系结构,有关的优点已经昭然若揭,为了更好的让您了解两者的区别,我们将两者进行一些比较。
C/S结构的缺点:
缺乏有效的集权控制:在众多的C/S软件中我们不难看出,所有的构件不能够在一个地点(如一台机器)进行统一的管理,而不得不将他们分化在各个CLIENT的应用中,使得维护和安全保密均很困难。
缺乏安全性:在分散的计算机系统中,控制信息的访问安全是非常困难的,由于客户端经常需要对一些敏感的数据进行分析导致安全漏洞很容易发生。
客户端工作量重:当将一个应用中的所有的商业逻辑全部在各个客户端来实现的时候,仅仅是使用桌面电脑的客户端资源将发生不堪负载的情况。
软件的重用性差:由于C/S结构下的应用软件一般均是根据操作系统进行定制,且开发工具也是有一定的限定,一旦需要改变某一个要素的话,很可能只能重做,例如原来用C语言来开发,现在需要转向PB进行开发,那么,原来的所有工作都需要重新来过。
随着应用的不断复杂,桌面电脑将需要不断的升级以适应系统的性能需求,甚至有时侯会完全超出桌面系统能够承受的限度。例如:诸如多线程和对称多重处理技术等先进操作系统的特性可能不能在标准桌面电脑系统中提供,不通过访问具有这些技术的服务器,客户端的桌面系统将可能永远不能获得这些新的技术的性能。
针对这些问题,三层体系结构给予了很好的解决方案。
在三层体系结构中,提供在客户端和服务器端进行应用功能的分割,系统通过应用将用户定义的界面系统从商业处理逻辑中分割出去。通过将商业处理逻辑集中在中间件服务器中,将能够减小客户端的工作量并使敏感数据访问控制变得简单。
  在三层结构中,客户端将与服务器端的数据变化隔离,简单的说,商业处理逻辑不受客户端的用户界面的改变而影响。三层体系中有一个非常重要的特性就是系统具有良好的组件重用性,例如在PB中开发的组件,可以在VC中进行使用。其图例见图4。
  (说明:在很多的关于三层结构的中间件讨论中,我们经常可以发现交易中间件的概念,在这里我们进行了沿用,实际上它就是我们编写的处理商业逻辑的组件的管理软件集。)





     图4:三层体系结构中的组件重用性。
guohongning 2001-08-13
  • 打赏
  • 举报
回复
我是用oracle的,感觉不错,sqlserver没太接触,愿听各位高论
zhuzhichao 2001-08-13
  • 打赏
  • 举报
回复
手工创建数据库的全部脚本及说明
---摘自[Oracle技术网]
系统环境:
1、操作系统:Windows 2000 Server,机器内存128M
2、数据库: Oracle 8i R2 (8.1.6) for NT 企业版
3、安装路径:D:\ORACLE

建库步骤:
1、手工创建相关目录
D:\Oracle\admin\test
D:\Oracle\admin\test\adhoc
D:\Oracle\admin\test\bdump
D:\Oracle\admin\test\cdump
D:\Oracle\admin\test\create
D:\Oracle\admin\test\exp
D:\Oracle\admin\test\pfile
D:\Oracle\admin\test\udump

D:\Oracle\oradata\test
D:\Oracle\oradata\test\archive

2、手工创建初始化启动参数文件:D:\Oracle\admin\test\pfile\inittest.ora,内容:

3、手工创建D:\Oracle\Ora81\DATABASE\inittest.ora文件,

内容:IFILE='D:\Oracle\admin\test\pfile\inittest.ora'

4、使用orapwd.exe命令,创建D:\Oracle\Ora81\DATABASE\PWDtest.ora

命令:D:\Oracle\Ora81\bin\orapwd file=D:\Oracle\Ora81\DATABASE\PWDtest.ora password=ORACLE entries=5


5、通过oradim.exe命令,在服务里生成一个新的实例管理服务,启动方式为手工
set ORACLE_SID=test
D:\Oracle\Ora81\bin\oradim -new -sid test -startmode manual -pfile "D:\Oracle\admin\test\pfile\inittest.ora"

6、生成各种数据库对象
D:\>svrmgrl

--创建数据库
connect INTERNAL/oracle
startup nomount pfile="D:\Oracle\admin\test\pfile\inittest.ora"
CREATE DATABASE test
LOGFILE 'D:\Oracle\oradata\test\redo01.log' SIZE 2048K,
'D:\Oracle\oradata\test\redo02.log' SIZE 2048K,
'D:\Oracle\oradata\test\redo03.log' SIZE 2048K
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXLOGHISTORY 1
DATAFILE 'D:\Oracle\oradata\test\system01.dbf' SIZE 58M REUSE AUTOEXTEND ON NEXT 640K
MAXDATAFILES 254
MAXINSTANCES 1
CHARACTER SET ZHS16GBK
NATIONAL CHARACTER SET ZHS16GBK;

控制文件、日志文件在上面语句执行时生成


connect INTERNAL/oracle
--修改系统表空间
ALTER TABLESPACE SYSTEM DEFAULT STORAGE ( INITIAL 64K NEXT 64K MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 50);
ALTER TABLESPACE SYSTEM MINIMUM EXTENT 64K;

--创建回滚表空间
CREATE TABLESPACE RBS DATAFILE 'D:\Oracle\oradata\test\rbs01.dbf' SIZE 256M REUSE
AUTOEXTEND ON NEXT 5120K
MINIMUM EXTENT 512K
DEFAULT STORAGE ( INITIAL 512K NEXT 512K MINEXTENTS 8 MAXEXTENTS 4096);

--创建用户表空间
CREATE TABLESPACE USERS DATAFILE 'D:\Oracle\oradata\test\users01.dbf' SIZE 128M REUSE
AUTOEXTEND ON NEXT 1280K
MINIMUM EXTENT 128K
DEFAULT STORAGE ( INITIAL 128K NEXT 128K MINEXTENTS 1 MAXEXTENTS 4096 PCTINCREASE 0);

--创建临时表空间
CREATE TABLESPACE TEMP DATAFILE 'D:\Oracle\oradata\test\temp01.dbf' SIZE 32M REUSE
AUTOEXTEND ON NEXT 640K
MINIMUM EXTENT 64K
DEFAULT STORAGE ( INITIAL 64K NEXT 64K MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0) TEMPORARY;

--创建工具表空间
CREATE TABLESPACE TOOLS DATAFILE 'D:\Oracle\oradata\test\tools01.dbf' SIZE 64M REUSE
AUTOEXTEND ON NEXT 320K
MINIMUM EXTENT 32K
DEFAULT STORAGE ( INITIAL 32K NEXT 32K MINEXTENTS 1 MAXEXTENTS 4096 PCTINCREASE 0);

--创建索引表空间
CREATE TABLESPACE INDX DATAFILE 'D:\Oracle\oradata\test\indx01.dbf' SIZE 32M REUSE
AUTOEXTEND ON NEXT 1280K
MINIMUM EXTENT 128K
DEFAULT STORAGE ( INITIAL 128K NEXT 128K MINEXTENTS 1 MAXEXTENTS 4096 PCTINCREASE 0);

--创建回滚段
CREATE PUBLIC ROLLBACK SEGMENT RBS0 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS1 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS2 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS3 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS4 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS5 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS6 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS7 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS8 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS9 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS10 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS11 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS12 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS13 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS14 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS15 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS16 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS17 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS18 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS19 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS20 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS21 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS22 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS23 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );
CREATE PUBLIC ROLLBACK SEGMENT RBS24 TABLESPACE RBS STORAGE ( OPTIMAL 4096K );

--使回滚段在线
ALTER ROLLBACK SEGMENT "RBS0" ONLINE;
ALTER ROLLBACK SEGMENT "RBS1" ONLINE;
ALTER ROLLBACK SEGMENT "RBS2" ONLINE;
ALTER ROLLBACK SEGMENT "RBS3" ONLINE;
ALTER ROLLBACK SEGMENT "RBS4" ONLINE;
ALTER ROLLBACK SEGMENT "RBS5" ONLINE;
ALTER ROLLBACK SEGMENT "RBS6" ONLINE;
ALTER ROLLBACK SEGMENT "RBS7" ONLINE;
ALTER ROLLBACK SEGMENT "RBS8" ONLINE;
ALTER ROLLBACK SEGMENT "RBS9" ONLINE;
ALTER ROLLBACK SEGMENT "RBS10" ONLINE;
ALTER ROLLBACK SEGMENT "RBS11" ONLINE;
ALTER ROLLBACK SEGMENT "RBS12" ONLINE;
ALTER ROLLBACK SEGMENT "RBS13" ONLINE;
ALTER ROLLBACK SEGMENT "RBS14" ONLINE;
ALTER ROLLBACK SEGMENT "RBS15" ONLINE;
ALTER ROLLBACK SEGMENT "RBS16" ONLINE;
ALTER ROLLBACK SEGMENT "RBS17" ONLINE;
ALTER ROLLBACK SEGMENT "RBS18" ONLINE;
ALTER ROLLBACK SEGMENT "RBS19" ONLINE;
ALTER ROLLBACK SEGMENT "RBS20" ONLINE;
ALTER ROLLBACK SEGMENT "RBS21" ONLINE;
ALTER ROLLBACK SEGMENT "RBS22" ONLINE;
ALTER ROLLBACK SEGMENT "RBS23" ONLINE;
ALTER ROLLBACK SEGMENT "RBS24" ONLINE;

--修改sys用户的临时表空间为TEMP
alter user sys temporary tablespace TEMP;

--创建数据字典表
@D:\Oracle\Ora81\Rdbms\admin\catalog.sql;
@D:\Oracle\Ora81\Rdbms\admin\catexp7.sql
@D:\Oracle\Ora81\Rdbms\admin\catproc.sql
@D:\Oracle\Ora81\Rdbms\admin\caths.sql

connect system/manager
@D:\Oracle\Ora81\sqlplus\admin\pupbld.sql

connect internal/oracle
@D:\Oracle\Ora81\Rdbms\admin\catrep.sql
exit

--生成SQL*Plus帮助系统
sqlplus SYSTEM/manager
@D:\Oracle\Ora81\sqlplus\admin\help\helpbld.sql helpus.sql
exit

--修改system用户默认表空间和临时表空间
svrmgrl
connect internal/oracle
alter user system default tablespace TOOLS;
alter user system temporary tablespace TEMP;
exit

7、将test实例启动服务设置成自动启动方式
D:\Oracle\Ora81\bin\oradim -edit -sid test -startmode auto
zhuzhichao 2001-08-13
  • 打赏
  • 举报
回复
數據庫的世界是奇妙的世界.
我不是太喜歡Oracle,雖然它的功能相當的強大.
可能因為我腦袋太笨,想不出來為什麼一些在MSSQL,Sybase,Access中
都能執行通過的標準的SQL語句在Oracle上會通不過.
而且它的內容這麼的多,讓我不知從什麼地方著手,而且不知自己什麼時候會成為Oracle高手.

最喜歡的是SQL Server.我被它的易用性所折服.
而且它的Query Analyzer做的相當的好.不管什麼圖示化的功能幾乎都能在Query Analyzer中高定.
SQL Server的幫助和錯誤提示也是非常的好.不向Oracle那樣讓人摸不著頭腦.
pbdesigner 2001-08-13
  • 打赏
  • 举报
回复
up
qb_zhm 2001-08-12
  • 打赏
  • 举报
回复
er
lesni 2001-08-12
  • 打赏
  • 举报
回复
如果系统要求较高的话还是Oracle,不过很多PB应用习惯于SQL SERVER;
bihu 2001-08-12
  • 打赏
  • 举报
回复
好多高手呀
Tompage 2001-08-12
  • 打赏
  • 举报
回复
如果,访问量比较大的话,还是使用三层的结构比较好!
sunnyhym 2001-08-12
  • 打赏
  • 举报
回复
to SearchAlone(WindColor) 
你的系统有那么复杂吗?用那么多存储过程
sunnyhym 2001-08-12
  • 打赏
  • 举报
回复
to oldFoxFox(老刀把子)
如果是C/S结构放在客户端较好,如果B/S结构则放在中间层。个人意见,仅供参考。
sunnyhym 2001-08-12
  • 打赏
  • 举报
回复
我用oracle,我觉得 sqlplus is good.
myb123 2001-08-11
  • 打赏
  • 举报
回复
听课的!
谢谢!
sgq_hit 2001-08-11
  • 打赏
  • 举报
回复
学习学习
学习学习
hehe214 2001-08-11
  • 打赏
  • 举报
回复
好耶!好耶!
加载更多回复(93)

752

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧