Day012

1.

按照下列要求,用JavaScript写一个年,月,日的联动菜单:1、默认显示当前日期;2、选择年才可以选择月,选择月才可以选择日,并且 2 月的天数要正确;

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>年月日下拉框联动</title>
	</head>
	<body>
		<form name="dateInfo">
			<select name="yearName" onchange="testYear(this.value)">
				<option value="">请选择年</option>
			</select>
			<select name="monthName" onchange="testMonth(this.value)">
				<option value="">请选择月</option>
			</select>
			<select name="dayName">
				<option value="">请选择日</option>
			</select>
		</form>
		<script>
			// 定义各个月份天数
			var monthTemp = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
			/**
			 * 页面完成加载完成后执行
			 */
			window.onload = function() {
				// 获取当前年份   
				var yearValue = new Date().getFullYear();
				// 获取当前月份
				var monthValue = new Date().getMonth() + 1;
				// 以今年为准,前30年,后30年 
				for(var i = (yearValue - 30); i <= (yearValue + 30); i++) {
					document.dateInfo.yearName.options.add(new Option(" " + i + " 年", i));
				}
				//初始化月选框
	            initMonth(monthValue);
				// 设定年份
				document.dateInfo.yearName.value = yearValue;
				// 设定月份
				document.dateInfo.monthName.value = monthValue;
				// 获取当前月份的天数
				var dayValue = monthTemp[monthValue - 1];
				// 初始化日选项框
				initDay(dayValue, monthValue, yearValue);
				// 设置当前日
				document.dateInfo.dayName.value = new Date().getDate();
			}
			// 年发生变化时日期发生变化
			function testYear(yearValue) {
				// 获取当前月份
				var monthValue = document.dateInfo.monthName.value;
				// 判断年份是否被选中,未选中清空月选框,日选矿
				if(yearValue == "") {
					optionsClear(document.dateInfo.monthName);
					optionsClear(document.dateInfo.dayName);
					return;
				}
				//初始化月份
				initMonth(monthValue);			
				// 根据月份获取天数
				var dayValue = monthTemp[monthValue - 1];
				// 初始化日选项框
				initDay(dayValue, monthValue, yearValue);
			}
			// 月发生变化时日期联动   
			function testMonth(monthValue) {
				// 获取当前年份
				var yearValue = document.dateInfo.yearName.value;
				// 判断月份是否被选中,若未选中,则重置日选项框
				if(monthTemp == "") {			
					optionsClear(document.dateInfo.dayName);
					return;
				}
				// 根据月份获取天数
				var dayValue = monthTemp[monthValue - 1];
				// 初始化日选项框
				initDay(dayValue, monthValue, yearValue);
			}
			//初始化月选框
			function initMonth(monthValue) {
			    //获取当前月选框	
				var f = document.dateInfo.monthName;
				// 重置下拉框
				optionsClear(f);
				// 填充日下拉框
				for(var i = 1; i <= 12; i++) {
					f.options.add(new Option(" " + i + " 月", i));
			}
}
			// 初始化日选项框
			function initDay(dayValue, monthValue, yearValue) {
				// 判断是否是2月份,并且判断是否为闰年
				if(monthValue == 2 && isLeapYear(yearValue)) {
					dayValue++;
				}
				// 获取当前日下拉框
				var e = document.dateInfo.dayName;
				// 重置下拉框
				optionsClear(e);
				// 填充日下拉框
				for(var i = 1; i <= dayValue; i++) {
					e.options.add(new Option(" " + i + " 日", i));
				}
			}
			// 判断是否闰平年   
			function isLeapYear(year) {
				// 闰年的定义是(可被4整除)且((不可被100整除)或(可被400整除))的年份
				return(year % 4 == 0 && (year % 100 != 0 || year % 400 == 0));
			}
			// 重置下拉框
			function optionsClear(e) {
				e.options.length = 1;
			}
		</script>
	</body>
</html>
2.

常见的几种约束有哪些?分别代表什么意思?如何使用?

常用的约束有主键约束,外键约束,唯一约束,默认约束 。
1、主键:PRIMARY KEY(主键字段)保证了实体完整性,一个表只有一个主键,但一个主键可以包含多个字段,主键字段不能为空;
2、唯一:UNIQUE(约束字段)保证了实体完整性,一个表有多个唯一约束,一个唯一约束可有包含多个字段;
3、外键:FOREIGN KEY(外键字段),保证了引用完整性,一个表可以有多个外键;

4、默认值:DEFAULT(默认值的表达式或NULL),保证了域完整性,一个表可以有多个默认值约束,但是一个字段只有一个默认值。

3.数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用 Array 而不是 ArrayList?

1、存储内容比较:

Array 数组可以包含基本类型和对象类型,
ArrayList 却只能包含对象类型。
Array 数组在存放的时候一定是同种类型的元素。ArrayList 就不一定了 。

2、空间大小比较:
Array 数组的空间大小是固定的,所以需要事前确定合适的空间大小。
ArrayList 的空间是动态增长的,而且,每次添加新的元素的时候都会检查内部数组的空间是否足够。

3.方法上的比较:
ArrayList 方法上比 Array 更多样化,比如添加全部 addAll()、删除全部 removeAll()、返回迭代器 iterator() 等。

适用场景:
如果想要保存一些在整个程序运行期间都会存在而且不变的数据,我们可以将它们放进一个全局数组里, 但是如果我们单纯只是想要以数组的形式保存数据,而不对数据进行增加等操作,只是方便我们进行查找的话,那么,我们就选择 ArrayList。
如果我们需要对元素进行频繁的移动或删除,或者是处理的是超大量的数据,那么,使用 ArrayList 就真的不是一个好的选择,因为它的效率很低,使用数组进行这样的动作就很麻烦,那么,我们可以考虑选择 LinkedList


<think>我们正在解决JDBC错误11022,该错误指出不兼容的数据类型,具体发生在NVL函数的第10行第25列。根据错误信息,问题可能是在使用NVL函数时,两个参数的数据类型不兼容。NVL函数要求两个参数必须是相同的数据类型,或者可以隐式转换。我们需要检查SQL语句中NVL函数的两个参数的数据类型,确保它们兼容。参考引用中并没有直接相关的信息,但我们可以根据数据库的一般原理来解决问题。步骤:1.定位错误:错误发生在SQL语句的第10行第25列,因此我们需要检查该位置的NVL函数。2.检查NVL函数的两个参数:例如,NVL(expr1,expr2)。如果expr1和expr2的数据类型不同,且不能隐式转换,则会发生错误。3.常见的例子:expr1是字符串类型,而expr2是数字类型,或者相反。4.解决方案:显式转换其中一个参数,使两个参数的数据类型一致。例如,假设原始SQL类似:SELECTNVL(column1,0)FROMtable;如果column1是字符串类型,而0是数字,那么就会出现不兼容。我们可以将0转换成字符串:SELECTNVL(column1,'0')FROMtable;或者,如果希望结果是数字,但column1是字符串,我们可以尝试将column1转换成数字(注意:如果column1不能转换为数字,可能会出错):SELECTNVL(TO_NUMBER(column1),0)FROMtable;但是,请注意:如果column1包含非数字字符,TO_NUMBER会抛出错误。因此,我们需要确保数据是干净的,或者使用其他函数(如正则表达式)先验证,或者使用异常处理。另一种情况:可能是日期类型和字符串类型不匹配。例如:NVL(date_column,'01-JAN-1900')这里,如果date_column是日期类型,而第二个参数是字符串,那么我们需要将字符串转换为日期:NVL(date_column,TO_DATE('01-JAN-1900','DD-MON-YYYY'))因此,具体解决方案取决于实际的数据类型。建议:1.查看表结构,确定NVL函数第一个参数(通常是某个列)的数据类型。2.根据该数据类型,调整第二个参数,使其匹配。如果无法直接确定,可以在数据库中使用DESCRIBE命令查看表结构,或者查询数据字典视图(如ALL_TAB_COLUMNS)来获取列的数据类型。例如,在Oracle中:SELECTdata_typeFROMall_tab_columnsWHEREtable_name='YOUR_TABLE'ANDcolumn_name='YOUR_COLUMN';注意:表名和列名需要大写,因为Oracle数据字典中默认是大写。然后,根据得到的数据类型,修改第二个参数。另外,错误信息中提到的位置是第10行第25列,所以检查SQL语句的第10行,找到第25列左右的NVL函数。如果SQL语句很长,可以分段检查,或者使用工具格式化SQL以便定位。示例修正:假设原始SQL片段:...,NVL(salary,'N/A')ASsalary,--第10行,假设salary是数字类型,而'N/A'是字符串,则类型不兼容...修正为:...,NVL(TO_CHAR(salary),'N/A')ASsalary,--将数字转换为字符串...或者,如果希望保留数字类型,则不能使用'N/A',可以改为一个数字(比如0):...,NVL(salary,0)ASsalary,...但注意,业务上是否允许这样替换。总结:核心是确保NVL的两个参数类型一致或可隐式转换。通过检查列的数据类型,调整第二个参数的类型,或者使用转换函数。相关问题:1.如何查询Oracle中某个列的数据类型?2.在JDBC中如何处理数据类型转换问题?3.Oracle的NVL函数和NVL2函数有什么区别?4.除了NVL函数,还有哪些方法可以处理NULL值?</think>### JDBC错误11022:不兼容数据类型问题分析 您遇到的JDBC错误代码11022表明在SQL语句中使用了**不兼容的数据类型**,具体发生在`NVL`函数的第10行第25列位置。核心问题是`NVL`函数的两个参数数据类型不一致且无法隐式转换。 #### 问题原因解析 1. **NVL函数要求**: - `NVL(expr1, expr2)`要求`expr1`和`expr2`必须是**相同数据类型**或可隐式转换 - 常见不匹配场景: - 字符类型(VARCHAR/CHAR)与数字类型(NUMBER/INT)混合使用 - 日期类型(DATE/TIMESTAMP)与非日期值 - 二进制类型(BLOB/RAW)与字符串 2. **错误定位**: - 错误指向SQL语句第10行第25列,需检查该位置的`NVL`函数调用 - 示例问题代码: ```sql SELECT NVL(employee_id, 'N/A') -- 若employee_id是数字,'N/A'是字符串 FROM employees ``` #### 解决方案 通过显式数据类型转换解决兼容性问题: 1. **数字转字符串**: ```sql NVL(TO_CHAR(numeric_column), 'default') ``` ```sql -- 修正示例 SELECT NVL(TO_CHAR(salary), 'Unpaid') -- 原错误:salary(NUMBER)与'Unpaid'(VARCHAR) FROM payroll ``` 2. **字符串转数字**: ```sql NVL(TO_NUMBER(char_column), 0) ``` ```sql -- 修正示例 SELECT NVL(TO_NUMBER(employee_code), 9999) -- 原错误:employee_code(VARCHAR)与9999(NUMBER) FROM staff ``` 3. **日期处理**: ```sql NVL(date_column, TO_DATE('2023-01-01', 'YYYY-MM-DD')) ``` #### 验证步骤 1. 检查列数据类型: ```sql -- Oracle查询列类型 SELECT column_name, data_type FROM all_tab_columns WHERE table_name = 'YOUR_TABLE'; ``` 2. 使用`DUMP()`函数调试: ```sql SELECT DUMP(problem_column) FROM table WHERE rownum=1 ``` #### 预防措施 1. **统一数据类型**: ```sql CREATE TABLE employees ( id NUMBER, name VARCHAR2(50), -- 确保默认值类型匹配 bonus NUMBER DEFAULT 0 NOT NULL ); ``` 2. **使用`COALESCE`替代**(更标准): ```sql COALESCE(expr1, expr2, ...) -- 自动进行类型转换 ``` > **关键点**:数据库隐式转换规则因数据库而异,Oracle对`NVL`的类型检查比`COALESCE`更严格[^2]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值