<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>mun dev</title>
    <link>https://mndeveloper.tistory.com/</link>
    <description>Software Developer &amp;zwj; </description>
    <language>ko</language>
    <pubDate>Sat, 11 Jul 2026 21:45:51 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>mndev</managingEditor>
    <image>
      <title>mun dev</title>
      <url>https://tistory1.daumcdn.net/tistory/5579198/attach/4489359c148c4117a888ed9293bfb94c</url>
      <link>https://mndeveloper.tistory.com</link>
    </image>
    <item>
      <title>[Java] 자바 Math.ceil (소수점 올림)</title>
      <link>https://mndeveloper.tistory.com/431</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오랜만에 코딩테스트 풀이를 하다가 소수점이 있는 경우 올림을 해야하는 상황이었는데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건문으로 하기엔 코드가 길어지는 부분이 있어 풀이를 찾다가 Math.ceil을 사용해서 풀이 한 것을 보게 되어 정확히 정리해놓고자 작성해보기로 했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Math 클래스&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) random(랜덤 뽑기)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) abs(절대값)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) min(최소), max(최대)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) ceil(올림), floor(내림), round(반올림)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5) pow, sqrt: 제곱근 관련 함수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6) sin, cos, tan: 삼각함수 관련&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Math.ceil&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) 올림: 소수점 뒤에 1이상의 숫자가 있으면 올린다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1771656560394&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Math.ceil(8.0); // 8.0
Math.ceil(9.1); // 10.0
Math.ceil(9.9); // 10.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) 정수형으로 계산&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;자바는 정수형끼리 계산하면 결과도 정수형으로 나오는 부분을 주의해야한다.&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10/4는 계산하면 2.5 이니 Math.ceil을 사용하면 3이 나오겠지? 라고 생각하면 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10/4를 하면 둘다 정수형이므로 뒤에 0.5가 버려지기 때문에 올림을 하더라도 2.0이 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1771656697939&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Math.ceil(10/4); // 2 -&amp;gt; 2.0
Math.ceil(10.0/4.0); // 2.5 -&amp;gt; 3.0&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3) 나누기 계산에서 앞이 0인 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위에서와 마찬가지로 정수형끼리 나누면 소수점이 없어진다는 걸 꼭 알아두기.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답은 0.0과 1.0이다.&lt;/p&gt;
&lt;pre id=&quot;code_1771656780983&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Math.ceil(1/10); // 0.1 -&amp;gt; 0.0
Math.ceil(1.0/10.0); // 0.1 -&amp;gt; 1.0&lt;/code&gt;&lt;/pre&gt;</description>
      <category>공부/Java</category>
      <category>java math ceil</category>
      <category>java mathceil</category>
      <category>자바 math ceil</category>
      <category>자바 math 소수점 올리기</category>
      <category>자바 소수점 올리기</category>
      <author>mndev</author>
      <guid isPermaLink="true">https://mndeveloper.tistory.com/431</guid>
      <comments>https://mndeveloper.tistory.com/431#entry431comment</comments>
      <pubDate>Sat, 21 Feb 2026 15:55:18 +0900</pubDate>
    </item>
    <item>
      <title>[Python] 공공데이터포털 OpenAPI 호출 에러 SSLError: HTTPSConnectionPool(host='apis.data.go.kr', port=443)</title>
      <link>https://mndeveloper.tistory.com/430</link>
      <description>&lt;p&gt;기존 공공데이터 API 화면에서 호출을 진행 했을 때는 수행이 잘 되다가 주피터노트북에서 호출하려고 보니 아래와 같은 에러가 발생하는 경우가 생겼다 .. &lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;import requests
import chardet
import xml.etree.ElementTree as ET
import logging

# API 요청
url = &amp;#39;https://apis.data.go.kr/1160100/service/GetFinaStatInfoService_V2/getSummFinaStat_V2&amp;#39;
serviceKey = &amp;#39;&amp;#39;
params = {&amp;#39;serviceKey&amp;#39;: serviceKey, &amp;#39;pageNo&amp;#39;: &amp;#39;1&amp;#39;, &amp;#39;numOfRows&amp;#39;: &amp;#39;10&amp;#39;, &amp;#39;resultType&amp;#39;: &amp;#39;xml&amp;#39;, &amp;#39;bizyear&amp;#39;: &amp;#39;2024&amp;#39;}

response = requests.get(url, params=params)
detected_encoding = chardet.detect(response.content)[&amp;#39;encoding&amp;#39;]
logger.info(f&amp;quot;Detected Encoding: {detected_encoding}&amp;quot;)

decoded_text = response.content.decode(detected_encoding)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;SSLError: HTTPSConnectionPool(host=&amp;#39;apis.data.go.kr&amp;#39;, port=443)&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;---------------------------------------------------------------------------
SSLError                                  Traceback (most recent call last)
/usr/local/lib/python3.10/dist-packages/urllib3/connectionpool.py in _make_request(self, conn, method, url, body, headers, retries, timeout, chunked, response_conn, preload_content, decode_content, enforce_content_length)
    467             try:
--&amp;gt; 468                 self._validate_conn(conn)
    469             except (SocketTimeout, BaseSSLError) as e:

18 frames
SSLError: [SSL: SSLV3_ALERT_ILLEGAL_PARAMETER] sslv3 alert illegal parameter (_ssl.c:1007)

During handling of the above exception, another exception occurred:

SSLError                                  Traceback (most recent call last)
SSLError: [SSL: SSLV3_ALERT_ILLEGAL_PARAMETER] sslv3 alert illegal parameter (_ssl.c:1007)

The above exception was the direct cause of the following exception:

MaxRetryError                             Traceback (most recent call last)
MaxRetryError: HTTPSConnectionPool(host=&amp;#39;apis.data.go.kr&amp;#39;, port=443): Max retries exceeded with url: /B552583/job/job_list_env?serviceKey= xx &amp;amp;pageNo=1&amp;amp;numOfRows=1000 (Caused by SSLError(SSLError(1, &amp;#39;[SSL: SSLV3_ALERT_ILLEGAL_PARAMETER] sslv3 alert illegal parameter (_ssl.c:1007)&amp;#39;)))

During handling of the above exception, another exception occurred:

SSLError                                  Traceback (most recent call last)
/usr/local/lib/python3.10/dist-packages/requests/adapters.py in send(self, request, stream, timeout, verify, cert, proxies)
    515             if isinstance(e.reason, _SSLError):
    516                 # This branch is for urllib3 v1.22 and later.
--&amp;gt; 517                 raise SSLError(e, request=request)
    518 
    519             raise ConnectionError(e, request=request)

SSLError: HTTPSConnectionPool(host=&amp;#39;apis.data.go.kr&amp;#39;, port=443): Max retries exceeded with url: /B552583/job/job_list_env?serviceKey= xx &amp;amp;pageNo=1&amp;amp;numOfRows=1000 (Caused by SSLError(SSLError(1, &amp;#39;[SSL: SSLV3_ALERT_ILLEGAL_PARAMETER] sslv3 alert illegal parameter (_ssl.c:1007)&amp;#39;)))&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;url에서 s를 빼고 호출하니 오류없이 정상적으로 실행되었다.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;url = &amp;#39;http://apis.data.go.kr/1160100/service/GetFinaStatInfoService_V2/getSummFinaStat_V2&amp;#39;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>이슈 해결 모음</category>
      <category>공공데이터 api 호출 sslerror</category>
      <category>공공데이터 포털 api 호출 에러 파이썬</category>
      <category>공공데이터 포털 sslerror</category>
      <category>공공데이터포털 api 호출 에러</category>
      <category>공공데이터포털 openapi 호출 에러 sslerror: httpsconnectionpool(host='apis.data.go.kr'</category>
      <author>mndev</author>
      <guid isPermaLink="true">https://mndeveloper.tistory.com/430</guid>
      <comments>https://mndeveloper.tistory.com/430#entry430comment</comments>
      <pubDate>Thu, 6 Feb 2025 10:41:00 +0900</pubDate>
    </item>
    <item>
      <title>[Spring] @ResponseBody를 이용한 데이터 반환</title>
      <link>https://mndeveloper.tistory.com/428</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;@ResponseBody&lt;/b&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 메소드의 응답속성은 Content-Type: text/plain&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@ResponseBody가 응답의 content-type을 바꿔주는 것은 아님, 해당 어노테이션이 달려 있는 메소드의 반환 값은 View Resolver로 가지 않기 때문에 순수 문자열, 데이터로 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1721454834755&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;    @RequestMapping(value = &quot;/test&quot;, method = RequestMethod.POST)
    @ResponseBody
    public Map&amp;lt;String, Object&amp;gt; ftpConnect (@RequestParam Map params, HttpServletRequest request) throws Exception {
        Map&amp;lt;String, Object&amp;gt; response = new HashMap&amp;lt;&amp;gt;();
        response.put(&quot;success&quot;, true);  // success 반환
        return response;
    }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;@ResponseBody를 사용하면 응답으로 데이터를 반환할 수 있음&lt;/p&gt;
&lt;pre id=&quot;code_1721454854283&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;		$http({
			method: &quot;POST&quot;,
			url: &quot;/test&quot;,
			params: params
		}).then(function mySuccess(response) {
			 console.log(response); // 결과 데이터 반환
		}, function(reponse) {
			console.log(reponse);
		});&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결과&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;116&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WdBsV/btsIGvp3GDz/zty0hxkxnIKIBrxpL3kkqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WdBsV/btsIGvp3GDz/zty0hxkxnIKIBrxpL3kkqk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WdBsV/btsIGvp3GDz/zty0hxkxnIKIBrxpL3kkqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWdBsV%2FbtsIGvp3GDz%2Fzty0hxkxnIKIBrxpL3kkqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;361&quot; height=&quot;116&quot; data-origin-width=&quot;361&quot; data-origin-height=&quot;116&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>공부/Spring</category>
      <category>responsebody 사용법</category>
      <category>responsebody란</category>
      <category>spring reponsebody 사용법</category>
      <category>스프링 reponsebody</category>
      <author>mndev</author>
      <guid isPermaLink="true">https://mndeveloper.tistory.com/428</guid>
      <comments>https://mndeveloper.tistory.com/428#entry428comment</comments>
      <pubDate>Sat, 20 Jul 2024 14:55:35 +0900</pubDate>
    </item>
    <item>
      <title>[Ajax] DataTable 옵션 및 사용법</title>
      <link>https://mndeveloper.tistory.com/427</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DataTable은 간편하게 데이터들을 테이블 형태로 나타낼 수 있다. DataTable에서 제공하는 옵션들이 있기에 오늘은 해당 옵션들을 정리해보고자 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1721454471579&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	var table = ('#Table').DataTable({
		&quot;destory&quot;: true, // 테이블 재생성
		&quot;paging&quot;: true, // 페이징 처리
		&quot;ordering&quot;: true, // 컬럼별 정렬 기능
		&quot;autoWidth&quot;: false, // 가로 자동
		&quot;pageLength&quot;: 50, // 기본 데이터 건수
		&quot;lengthMenu&quot;: [[50, 100, 1000], [50, 100, &quot;Max(1000)&quot;]], // 데이터건수 옵션
		&quot;order&quot;: [15, 'desc'],
		&quot;searching&quot;: false, // 검색
		&quot;scrollX&quot;: true, // 가로 스크롤
		&quot;ajax&quot;: function(data, callback, settings) {// ajax 호출
			$ajax({
				url: &quot;data.do&quot;,
				data: {
					params: JSON.stringify({
						id: id
					})
				},
				success: function(res) {
					// 받아온 데이터 조작
					// 콜백 함수에 파라미터 데이터
					callback(res);
				}
			});
		},
		&quot;columns&quot;: [ // 받아온 데이터의 이름 
			{ &quot;data&quot;: &quot;id&quot;, &quot;defaultContent&quot;: &quot;&quot;, &quot;className&quot;: &quot;left&quot; },
			{ &quot;data&quot;: &quot;name&quot;, &quot;defaultContent&quot;: &quot;&quot; }
		],
		&quot;columnDefs&quot;: [ // 컬럼 조작
			{
				&quot;width&quot;: &quot;1em&quot;, // 가로 길이
				&quot;title&quot;: &quot;ID&quot;, // 컬럼 제목
				&quot;targets&quot;: 1, // 데아터 타겟
				&quot;orderable&quot;: false // 해당 컬럼만 정렬 기능 사용 안함
			},
			{
				&quot;width&quot;: &quot;1em&quot;,
				&quot;title&quot;: &quot;ID&quot;,
				&quot;targets&quot;: 2
			}
		]
	})&lt;/code&gt;&lt;/pre&gt;</description>
      <category>공부/Jquery</category>
      <category>ajax datatable 사용법</category>
      <category>ajax datatable 옵션</category>
      <category>ajax 데이터 테이블 옵션</category>
      <category>데이터 테이블 ajax</category>
      <author>mndev</author>
      <guid isPermaLink="true">https://mndeveloper.tistory.com/427</guid>
      <comments>https://mndeveloper.tistory.com/427#entry427comment</comments>
      <pubDate>Sat, 20 Jul 2024 14:48:39 +0900</pubDate>
    </item>
    <item>
      <title>[Oracle] For update 란? 사용법</title>
      <link>https://mndeveloper.tistory.com/426</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;For Update 란?&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Oracle 데이터베이스에서 사용되는 특별한 SQL구문이다. 이 구문은 SELECT 문장에서 사용되며, SELECT로 조회된 데이터에 대한 잠금(lock)을 설정하는 목적을 가진다. 주로 다음과 같은 경우에 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 비관적 잠금(Pessimistic Locking)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;For update 구문을 사용하여 특정 데이터 행을 조회하고, 그 행에 대한 잠금을 설정한다. 이 잠금은 다른 트랜잭션이 같은 데이터를 수정하거나 삭제하는 것을 막아준다. 다만, 이 방식은 다수의 트랜잭션에서 동시에 같은 데이터에 접근할 때 성능에 영향을 줄 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 커서 안정성(Cursor Stability)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;For update 구문을 사용하여 SELECT문에서 조회된 데이터에 대해 커서가 열린 상태에서 해당 데이터 행에 대한 잠금을 유지할 수 있다. 이는 트랜잭션이 커밋되거나 롤백될 때까지 해당 데이터를 보호하는 역할을 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1721454044126&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT column1, column2, ...
FROM table_name
WHERE condition
FOR UPDATE;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 table_name은 조회할 테이블 이름이고, condition은 선택적인 검색 조건&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FOR UPDATE 절은 해당 SELECT 문장이 조회한 데이터에 대해 잠금을 설정한다. 이후 해당 트랜잭션이 커밋되거나 롤백될 때까지 해당 데이터에 대한 잠금이 유지된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 구문을 사용할 때 주의할 점은 잠금을 설정한 데이터를 수정하거나 삭제하는 작업이 끝난 후에는 트랜잭션을 빠르게 커밋하거나 롤백해야 하며, 잠금을 오랫동안 유지하는 것은 다른 사용자의 데이터 접근성과 성능에 부정적인 영향을 미칠 수 있어 자주 사용은 좋지 않다고 한다.&lt;/p&gt;</description>
      <category>DB/Oracle</category>
      <category>for update</category>
      <category>for update 오라클</category>
      <category>for update 오라클 사용법</category>
      <category>oracle for update</category>
      <category>오라클 for update 사용법</category>
      <author>mndev</author>
      <guid isPermaLink="true">https://mndeveloper.tistory.com/426</guid>
      <comments>https://mndeveloper.tistory.com/426#entry426comment</comments>
      <pubDate>Sat, 20 Jul 2024 14:43:21 +0900</pubDate>
    </item>
    <item>
      <title>[Java] 클라이언트 실제 IP 가져오기</title>
      <link>https://mndeveloper.tistory.com/425</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1721452709692&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ip = request.getRemoteAddr();&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해당 코드로 localhost:포트로 접속시 ip는 0:0:0:0:0:0:0:1 이런 형태(Ipv6)으로 나오기 때문에 ipv4주소로 얻을 수 있도록 함수를 만든 후에 툴에서 설정을 해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. &lt;/b&gt;&lt;b&gt;getClientIP 함수 만들기&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1721452924052&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;	public static String getClientIP(HttpServletRequest request) {
	    String ip = request.getHeader(&quot;X-Forwarded-For&quot;);
	    System.out.println(&quot;&amp;gt; X-FORWARDED-FOR : &quot; + ip);

	    if (ip == null) {
	        ip = request.getHeader(&quot;Proxy-Client-IP&quot;);
	        System.out.println(&quot;&amp;gt; Proxy-Client-IP : &quot; + ip);
	    }
	    if (ip == null) {
	        ip = request.getHeader(&quot;WL-Proxy-Client-IP&quot;);
	        System.out.println(&quot;&amp;gt;  WL-Proxy-Client-IP : &quot; + ip);
	    }
	    if (ip == null) {
	        ip = request.getHeader(&quot;HTTP_CLIENT_IP&quot;);
	        System.out.println(&quot;&amp;gt; HTTP_CLIENT_IP : &quot; + ip);
	    }
	    if (ip == null) {
	        ip = request.getHeader(&quot;HTTP_X_FORWARDED_FOR&quot;);
	        System.out.println(&quot;&amp;gt; HTTP_X_FORWARDED_FOR : &quot; + ip);
	    }
	    if (ip == null) {
	        ip = request.getRemoteAddr();
	        System.out.println(&quot;&amp;gt; getRemoteAddr : &quot;+ip);
	    }
	    System.out.println(&quot;&amp;gt; Result : IP Address : &quot;+ip);

	    return ip;
	}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2.&amp;nbsp; Ipv4 주소로 설정&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Run &amp;gt; Run Configuration &amp;gt; Arguments&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;-Djava.net.preferIPv4Stack=true&lt;/li&gt;
&lt;li&gt;ipv4 주소 설정&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;716&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chFGaj/btsIGvDxA6v/f2WqOJSi8SWxOvvXxpW0O1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chFGaj/btsIGvDxA6v/f2WqOJSi8SWxOvvXxpW0O1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chFGaj/btsIGvDxA6v/f2WqOJSi8SWxOvvXxpW0O1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FchFGaj%2FbtsIGvDxA6v%2Ff2WqOJSi8SWxOvvXxpW0O1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;700&quot; height=&quot;716&quot; data-origin-width=&quot;700&quot; data-origin-height=&quot;716&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. &lt;span style=&quot;background-color: #f8f8f8; color: #333333; text-align: left;&quot;&gt;getClientIP 함수 호출,&lt;/span&gt;&amp;nbsp;&lt;a style=&quot;color: #000000;&quot; href=&quot;http://localhost:8080/&quot; data-token-index=&quot;0&quot;&gt;&lt;span&gt;localhost:8080&lt;/span&gt;&lt;/a&gt; 접속시 나오는 ip&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;105&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lIKnr/btsIHV12hFc/gFxHCzATopVk4HpGTjEQI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lIKnr/btsIHV12hFc/gFxHCzATopVk4HpGTjEQI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lIKnr/btsIHV12hFc/gFxHCzATopVk4HpGTjEQI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlIKnr%2FbtsIHV12hFc%2FgFxHCzATopVk4HpGTjEQI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;247&quot; height=&quot;105&quot; data-origin-width=&quot;247&quot; data-origin-height=&quot;105&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. 본인의 ip로 테스트 하고 싶을 경우&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;cmd &amp;gt; ipconfig &amp;gt; ipv4&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cG7RRy/btsIHAjxdVX/a5QrQpT8uoJYX3fnVNDhGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cG7RRy/btsIHAjxdVX/a5QrQpT8uoJYX3fnVNDhGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cG7RRy/btsIHAjxdVX/a5QrQpT8uoJYX3fnVNDhGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcG7RRy%2FbtsIHAjxdVX%2Fa5QrQpT8uoJYX3fnVNDhGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;565&quot; height=&quot;574&quot; data-origin-width=&quot;565&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;5. Ipv4주소:8080 접속&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;localhost로 접속했을 때와 같이 ipv4주소 가 잘 나오는 것을 확인할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>공부/Java</category>
      <category>ipv4 출력 자바</category>
      <category>ipv4주소 받기 자바</category>
      <category>자바 클라이언트 ip</category>
      <category>자바 클라이언트 ip 받기</category>
      <category>자바 클라이언트 ip 출력</category>
      <category>클라이언트 ip 자바</category>
      <category>클라이언트 ipv4 자바</category>
      <author>mndev</author>
      <guid isPermaLink="true">https://mndeveloper.tistory.com/425</guid>
      <comments>https://mndeveloper.tistory.com/425#entry425comment</comments>
      <pubDate>Sat, 20 Jul 2024 14:29:34 +0900</pubDate>
    </item>
    <item>
      <title>[error] 이클립스 SVN Connector 설치 오류 connector discovery completed without finding any connectors</title>
      <link>https://mndeveloper.tistory.com/424</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SVN 환경세팅 중 오류가 발생해 다른 포스팅들을 참고해서 나온 방법을 거의 다 해봤는데 해결이 되지 않았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계속 찾다가 발견한 SVN 수동 설치 URL로 해결할 수 있었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. Window - Preference - SVN -Git Connectors.. 클릭&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;676&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo3z0F/btsGkozWvcF/XTrjiPjFK4MvkbsEWDSBzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo3z0F/btsGkozWvcF/XTrjiPjFK4MvkbsEWDSBzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo3z0F/btsGkozWvcF/XTrjiPjFK4MvkbsEWDSBzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo3z0F%2FbtsGkozWvcF%2FXTrjiPjFK4MvkbsEWDSBzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;759&quot; height=&quot;676&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;676&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. No Connectors Found 에러가 발생하는데, Git Connectior에서 직접 URL을 입력하고 설치&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 수동 설치 URL&lt;/b&gt; : &lt;span&gt;&lt;/span&gt;&lt;a href=&quot;https://osspit.org/eclipse/subversive-connectors/&quot;&gt;https://osspit.org/eclipse/subversive-connectors/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1712196645866&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Index of /eclipse/subversive-connectors&quot; data-og-description=&quot;&quot; data-og-host=&quot;osspit.org&quot; data-og-source-url=&quot;https://osspit.org/eclipse/subversive-connectors/&quot; data-og-url=&quot;https://osspit.org/eclipse/subversive-connectors/&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://osspit.org/eclipse/subversive-connectors/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://osspit.org/eclipse/subversive-connectors/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Index of /eclipse/subversive-connectors&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;osspit.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;157&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PjLUD/btsGkANEItU/1SYIks6E8AYZUuRhHZ00w0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PjLUD/btsGkANEItU/1SYIks6E8AYZUuRhHZ00w0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PjLUD/btsGkANEItU/1SYIks6E8AYZUuRhHZ00w0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPjLUD%2FbtsGkANEItU%2F1SYIks6E8AYZUuRhHZ00w0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;537&quot; height=&quot;157&quot; data-origin-width=&quot;537&quot; data-origin-height=&quot;157&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Uasf7/btsGmW9Mdt5/BiRDzKPzLStHcBJjO5KLi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Uasf7/btsGmW9Mdt5/BiRDzKPzLStHcBJjO5KLi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Uasf7/btsGmW9Mdt5/BiRDzKPzLStHcBJjO5KLi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUasf7%2FbtsGmW9Mdt5%2FBiRDzKPzLStHcBJjO5KLi1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;917&quot; height=&quot;700&quot; data-origin-width=&quot;917&quot; data-origin-height=&quot;700&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 한 다음 next 하면 RESTART가 뜨게 되는데, RESTRAT 후에는 잘 연결되는 것을 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>이슈 해결 모음</category>
      <category>connector discovery completed without finding any connectors</category>
      <category>connector discovery completed without finding any connectors 해결</category>
      <category>이클립스 SVN Connector 설치 오류</category>
      <category>이클립스 SVN Connector 설치 오류 connector discovery completed without finding any connectors</category>
      <author>mndev</author>
      <guid isPermaLink="true">https://mndeveloper.tistory.com/424</guid>
      <comments>https://mndeveloper.tistory.com/424#entry424comment</comments>
      <pubDate>Thu, 4 Apr 2024 11:12:22 +0900</pubDate>
    </item>
    <item>
      <title>[PL SQL] CSV 파일로 데이터 삽입하기</title>
      <link>https://mndeveloper.tistory.com/423</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;1. 먼저, CSV 파일로 데이터를 넣기 전 넣고자 하는 테이블을 생성해준다.&lt;/b&gt;&lt;/h4&gt;
&lt;pre id=&quot;code_1711696903708&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;create table book_info(
ID NUMBER(20) PRIMARY KEY,
reg_num varchar2(2000),
call_num varchar2(3000),
bname varchar2(2000),
author varchar2(1000),
publisher varchar2(1000),
pub_year varchar2(1000),
price number(30),
loc varchar(1000)
);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;2. 상단 메뉴 - TOOL - Text&amp;nbsp; Importer&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;827&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b9HD3j/btsGdshrjNf/CSek78jzq0luVDm2m1GeU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b9HD3j/btsGdshrjNf/CSek78jzq0luVDm2m1GeU0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b9HD3j/btsGdshrjNf/CSek78jzq0luVDm2m1GeU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb9HD3j%2FbtsGdshrjNf%2FCSek78jzq0luVDm2m1GeU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1108&quot; height=&quot;827&quot; data-origin-width=&quot;1108&quot; data-origin-height=&quot;827&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;3. 파일 아이콘 클릭 - CSV 파일 선택&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 주의) CSV 파일 명이 영어로 되어 있어야함, 한글로 되어 있을 땐 데이터가 불러와지지 않음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 테이블의 컬럼명과 데이터들의 컬럼명을 같게 해주면 잘 불러와짐&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;642&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VL9UV/btsGbBT4rSx/bUXu8qikefKSUVfWECJKDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VL9UV/btsGbBT4rSx/bUXu8qikefKSUVfWECJKDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VL9UV/btsGbBT4rSx/bUXu8qikefKSUVfWECJKDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVL9UV%2FbtsGbBT4rSx%2FbUXu8qikefKSUVfWECJKDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;792&quot; height=&quot;642&quot; data-origin-width=&quot;792&quot; data-origin-height=&quot;642&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;4. Data to Oracle&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Owner: 현재 접속되어 있는 스키마&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Table: 데이터를 삽입할 테이블 선택&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이렇게 하면 각 필드와 테이블 컬럼이 잘 매칭된 것을 볼 수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Import하면 데이터 삽입(삽입된건 SELECT문으로 조회해보기)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAnnHk/btsGaX4a6r9/z1yVQuaF0ic4w4D4qJHTl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAnnHk/btsGaX4a6r9/z1yVQuaF0ic4w4D4qJHTl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAnnHk/btsGaX4a6r9/z1yVQuaF0ic4w4D4qJHTl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAnnHk%2FbtsGaX4a6r9%2Fz1yVQuaF0ic4w4D4qJHTl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;797&quot; height=&quot;644&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;644&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>DB</category>
      <category>csv 파일 데이터 넣기</category>
      <category>csv 파일 데이터 넣는 법</category>
      <category>pl sql csv 데이터 삽입</category>
      <category>pl sql 엑셀 데이터 삽입</category>
      <category>plsql 파일 데이터 삽입</category>
      <author>mndev</author>
      <guid isPermaLink="true">https://mndeveloper.tistory.com/423</guid>
      <comments>https://mndeveloper.tistory.com/423#entry423comment</comments>
      <pubDate>Fri, 29 Mar 2024 16:25:48 +0900</pubDate>
    </item>
    <item>
      <title>[Oracle] 분석 함수(Analytic Function)</title>
      <link>https://mndeveloper.tistory.com/422</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Analytic Function&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Row들의 집합으로 Partition이라는 Result Set을 만들며 연산의 범위를 결정하기 위해 각각 Row들을 대상으로 Data Sliding Window를 구성&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Analytic Function 수행 과정&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Joins, Where, Group by, Having 등의 수행으로 Data를 추출&lt;/li&gt;
&lt;li&gt;Analytic Function이 이용할 수 있는 Result Set 생성,&lt;/li&gt;
&lt;li&gt;Order by 절이 있다면 Order by를 수행하여 최종 Result Set 반환&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;User Defined Function을 정의하여 Over 절과 같이 사용가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Analytic Function 예&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;select deptno, sum(sal) over (order by deptno)
from emp;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Category&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 288px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style8&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;Type&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;설명&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;예&lt;/td&gt;
&lt;td style=&quot;height: 20px;&quot;&gt;방법&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 68px;&quot;&gt;
&lt;td style=&quot;height: 68px;&quot;&gt;Ranking Function&lt;/td&gt;
&lt;td style=&quot;height: 68px;&quot;&gt;대상 집합에 대해 특정 컬럼을 기준으로 순위나 등급을 매기는 Analytic Function&lt;/td&gt;
&lt;td style=&quot;height: 68px;&quot;&gt;각 회원사 영업점 별 거래량 상위 10위안에 포함되는 계조라를 찾아라&lt;/td&gt;
&lt;td style=&quot;height: 68px;&quot;&gt;RANK, DENSE_RANK, TOP_N, BOTTOM_N, NTILE, CUMI_DEST, PRCENT_RANK, ROW_NUMBER&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 80px;&quot;&gt;
&lt;td style=&quot;height: 80px;&quot;&gt;Windowing &lt;br /&gt;Function&lt;/td&gt;
&lt;td style=&quot;height: 80px;&quot;&gt;Current row를 기준으로 지정된 window 내의 row들을 대상으로 집단화(aggregation)을 수행하여 여러가지 유용한 집계 정보를 구하는 Analytic Function류&lt;/td&gt;
&lt;td style=&quot;height: 80px;&quot;&gt;영업점별로 거래량 누적치를 나타내라&lt;/td&gt;
&lt;td style=&quot;height: 80px;&quot;&gt;SUM, AVG, MIN, MAX, STDDEV, VARIANCE, COUNT, FIRST_VALUE, LAST_VALUE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 60px;&quot;&gt;
&lt;td style=&quot;height: 60px;&quot;&gt;Reporting Function&lt;/td&gt;
&lt;td style=&quot;height: 60px;&quot;&gt;서로 다른 두 가지 aggregation level을 비교하고자 하는 목적으로 사용하는 Analytic Function&lt;/td&gt;
&lt;td style=&quot;height: 60px;&quot;&gt;영업점 거래량이 회원사에서 차지하는 비율을 나타내라&lt;/td&gt;
&lt;td style=&quot;height: 60px;&quot;&gt;RATIO_TO_REPORT&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 60px;&quot;&gt;
&lt;td style=&quot;height: 60px;&quot;&gt;LEAD/LAG&lt;/td&gt;
&lt;td style=&quot;height: 60px;&quot;&gt;서로 다른 두 row 값 비교&lt;/td&gt;
&lt;td style=&quot;height: 60px;&quot;&gt;2009년 6월, 특정 영업점의 거래량에 대한 작년 거래량 대비 증가비율 나타내기&lt;/td&gt;
&lt;td style=&quot;height: 60px;&quot;&gt;LAG, LEAD&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;예시 데이터 삽입&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;create table sales_tables
(sales_person varchar2(15),
region varchar(10),
amount number(10));

insert into sales_tables values('Davis', 'East', 100);
insert into sales_tables values('Baker','East',89);
insert into sales_tables values('Smith','East',89);
insert into sales_tables values('Fitzpatrik','East',75);
insert into sales_tables values('Jones','West',98);
insert into sales_tables values('Peterson','West',85);
insert into sales_tables values('Lee','West',77);
commit;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;RANK()&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 row마다 순위를 매겨주는 함수로 Partition 내에서 Order by 절에 명시된 대로 정렬한 후 순위를 의미하고, 1부터 시작하며 동일한 순위를 가지며 동일한 순위의 수만큼 다음 순위는 건너 뛴다.&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;select sales_person, region, amount,
rank() over(partition by region order by amount desc) as rank
from sales_tables;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;TOP_N / BOTTOM_N&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RANK 함수 작성시 해당하는 순위만 출력하기 위해 사용하는 함수&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT *
  FROM (SELECT SALES_PERSON,
               REGION,
               AMOUNT,
               RANK() OVER(PARTITION BY REGION ORDER BY AMOUNT DESC) AS RANK
          FROM SALES_TABLES) A
 WHERE RANK &amp;lt;= 2;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;NTILE()&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NTILE 함수는 정렬된 PARTITON을 BUCKET 이라 불리는 그룹별로 나누고 PARTITION 내의 각 ROW등을 BUCKET에 배치하는 함수로 각 BUCKET에는 동일한 수의 ROW가 배치된다.&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt; SELECT SALES_PERSON, AMOUNT, NTILE(4) OVER(ORDER BY AMOUNT DESC) AS NTILE
   FROM SALES_TABLES;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;ROW_NUMBER()&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ROW_NUMBER는 각 PARTITION 내에서 ORDER BY 절에 의해 정렬된 순서로 유일한 값을 돌려주는 함수로 ROWNUM과는 관계가 없다.&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;SELECT SALES_PERSON, AMOUNT, ROW_NUMBER() OVER(ORDER BY AMOUNT DESC) AS RN
  FROM SALES_TABLES;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Windowing&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정렬된 순서에 따라 누적, 증감, 평균값 등을 각각 Row에 대하여 반환&lt;/li&gt;
&lt;li&gt;ROWS | RANGE: ROW 또는 논리적인 범위로 WINDOW를 지정&lt;/li&gt;
&lt;li&gt;BETWEEN &amp;hellip; AND: WNDOW에서 START POINT와 END POINT를 지정&lt;/li&gt;
&lt;li&gt;UNBOUNDED PRECEDING: PARTITION의 첫 번째 ROW에서 WINDOW가 시작&lt;/li&gt;
&lt;li&gt;UNBOUNDED FOLLOWING: PARTITION의 마지막 ROW에서 WINDOW가 끝남&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT DEPTNO,
       JOB,
       EMPNO,
       ENAME,
       HIREDATE,
       SAL,
       SUM(SAL) OVER(PARTITION BY DEPTNO ORDER BY JOB ROWS UNBOUNDED PRECEDING) 누계
  FROM EMP;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Windowing 예제 데이터 삽입&lt;/b&gt;&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;create table ledger (
acct_number varchar(10), trans_date date, trans_amount number(10,2));

insert into ledger values('73829',to_date('19981101','yyyymmdd'),113.45);
insert into ledger values('73829',to_date('19981105','yyyymmdd'),-52.01);
insert into ledger values('73829',to_date('19981113','yyyymmdd'),36.25);
insert into ledger values('73829',to_date('19981205','yyyymmdd'),12.10);
insert into ledger values('73829',to_date('19981213','yyyymmdd'),50.10);
insert into ledger values('82930',to_date('19981101','yyyymmdd'),10.56);
insert into ledger values('82930',to_date('19981121','yyyymmdd'),32.55);
insert into ledger values('82930',to_date('19981129','yyyymmdd'),-5.02);
insert into ledger values('82930',to_date('19981212','yyyymmdd'),10.02);
insert into ledger values('82930',to_date('19981221','yyyymmdd'),20.05);
commit;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Cumulative Aggregation&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 파티션의 시작 위치가 Window의 사작 위치가 되고,현재 Row의 물리적 또는 논리적 위치가 Window의 종료 위치가 되어 여기에 해당하는 집계함수를 적용하는 형태&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT ACCT_NUMBER,
       TRANS_DATE,
       TRANS_AMOUNT,
       SUM(TRANS_AMOUNT) OVER(PARTITION BY ACCT_NUMBER ORDER BY TRANS_DATE ROWS UNBOUNDED PRECEDING) AS BALANCE
  FROM LEDGER
 ORDER BY ACCT_NUMBER, TRANS_DATE;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Moving Aggregation&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 파티션 내의 현재 row의 물리적 또는 논리적 위치가 윈도우의 종료위치가 되고, 이 종료 위치를 기준으로 offset을 적용하여 시작위치가 결정되고 여기에 해당하는 집계함수를 적용하는 형태&lt;/p&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;SELECT ACCT_NUMBER,
       TRANS_DATE,
       TRANS_AMOUNT,
       AVG(TRANS_AMOUNT) OVER(PARTITION BY ACCT_NUMBER ORDER BY TRANS_DATE RANGE INTERVAL '7' DAY PRECEDING) AS MAVG_7DAY
  FROM LEDGER;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Reporting: RATIO_TO_REPORT&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RETIO_TO_REPORT 함수는 Window 내의 합계에 대한 비율을 계산하는 함수&lt;/p&gt;
&lt;pre class=&quot;n1ql&quot;&gt;&lt;code&gt;SELECT DEPTNO,
       JOB,
       SUM(SAL) SUM_SAL,
       SUM(SUM(SAL)) OVER(PARTITION BY DEPTNO) SUM_TOTAL,
       RATIO_TO_REPORT(SUM(SAL)) OVER(PARTITION BY DEPTNO) RATIO_TO_SUM
  FROM EMP
 GROUP BY DEPTNO, JOB;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;LAG/LEAD&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오름차순 또는 내림차순으로 정렬된 파티션 내에서 상대적으로 상위 또는 하위에 위치하고 있는 특정 로우의 컬럼 값을 offset 지정에 의해 참조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파티션 내에서 참조할 로우가 없을 경우 지정한 값(default = NULL) 으로 출력&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot;&gt;&lt;code&gt;SELECT DEPTNO,
       EMPNO,
       SAL,
       LAG(SAL, 1) OVER(PARTITION BY DEPTNO ORDER BY SAL) AS SAL_LAG,
       LEAD(SAL, 1) OVER(PARTITION BY DEPTNO ORDER BY SAL) AS SAL_LEAD
  FROM EMP;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Analytic Function의 장점&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Query Speed의 향상&lt;/li&gt;
&lt;li&gt;Self-join, 절차적 로직으로 표현한 것을 native SQL에서 바로 적용할 수 있도록 하여 Join이나 프로그램의 Over head를 줄임&lt;/li&gt;
&lt;li&gt;향상된 개발 생산력&lt;/li&gt;
&lt;li&gt;간결한 SQL로 복잡한 분석 작업을 수행 가능하며, 유지보수가 간편하여 생산성 향상&lt;/li&gt;
&lt;li&gt;이해 및 활용이 용이&lt;/li&gt;
&lt;li&gt;기존 SQL Syntax를 그대로 따르기 때문에 ANSI SQL로 채택&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Reference.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://www.gurubee.net/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;http://www.gurubee.net/&lt;/a&gt;&lt;/p&gt;</description>
      <category>DB/Oracle</category>
      <category>오라클 분석 함수</category>
      <category>오라클 분석함수</category>
      <category>오라클 분석함수 사용예시</category>
      <category>오라클 분석함수 장점</category>
      <category>오라클 분석함수 종류</category>
      <author>mndev</author>
      <guid isPermaLink="true">https://mndeveloper.tistory.com/422</guid>
      <comments>https://mndeveloper.tistory.com/422#entry422comment</comments>
      <pubDate>Mon, 18 Mar 2024 09:45:30 +0900</pubDate>
    </item>
    <item>
      <title>[PL SQL] 함수(Function) 사용법</title>
      <link>https://mndeveloper.tistory.com/421</link>
      <description>&lt;h3&gt;함수(Function)이란?&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;보통 값을 계산하고 결과 값을 반환하기 위해서 함수를 많이 사용한다.&lt;/li&gt;
&lt;li&gt;대부분 구성이 프로시저와 유사하지만 IN 파라미터만 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;반드시 반환될 값의 데이터 타입을 RETURN문에 선언해야 한다.&lt;/li&gt;
&lt;li&gt;또한 PL/SQL 블록 내에서 RETURN문을 통해서 반드시 값을 반환해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;br&gt;


&lt;h3&gt;함수문법&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;-- PL/SQL 블록에는 적어도 한 개의 RETURN문이 있어야함
-- PL/SQL 블록은 함수가 수행할 내용을 정의한 몸체 부분

create or replace function function_name
[(argument..)]

return datatype
-- datatype은 반환되는 값의 datatype입니다.

is
[변수 선언 부분]

begin
[PL/SQL BLOCK]

-- 리턴문이 꼭 존재해야함
RETURN 변수;

END;&lt;/code&gt;&lt;/pre&gt;
&lt;br&gt;


&lt;h3&gt;함수 작성 예제&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;create or replace function fc_update_sal
(v_empno in number)

-- 리턴되는 변수의 데이터타입을 꼭 정의해야 함
return number

is
--%type 변수가 사용(스칼라 데이터 타입 참고)
v_sal emp.sal%type;

begin

update emp
set sal = sal * 1.1
where empno = v_empno;

commit;

select sal
into v_sal
from emp
where empno = v_empno;

-- 리턴문이 꼭 존재
return v_sal;

end;
/&lt;/code&gt;&lt;/pre&gt;
&lt;br&gt;


&lt;h3&gt;함수 실행 예제&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;-- 먼저 함수의 반환값을 저장할 변수 선언
var salary number;

-- EXECUTE문을 이용해 함수를 실행
execute :salary := fc_update_sal(7900);

-- print문을 사용해 출력
print salary;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Reference.&lt;br&gt;&lt;a href=&quot;http://www.gurubee.net/lecture/1042&quot;&gt;http://www.gurubee.net/lecture/1042&lt;/a&gt;&lt;/p&gt;</description>
      <category>DB/Oracle</category>
      <category>PL SQL 함수</category>
      <category>PL SQL 함수 사용</category>
      <category>plsql 함수</category>
      <category>plsql 함수 사용법</category>
      <author>mndev</author>
      <guid isPermaLink="true">https://mndeveloper.tistory.com/421</guid>
      <comments>https://mndeveloper.tistory.com/421#entry421comment</comments>
      <pubDate>Tue, 27 Feb 2024 15:47:25 +0900</pubDate>
    </item>
  </channel>
</rss>