{"id":16846,"date":"2025-02-11T08:52:20","date_gmt":"2025-02-11T16:52:20","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=16846"},"modified":"2025-07-08T09:15:37","modified_gmt":"2025-07-08T16:15:37","slug":"plsql-to-javascript-udf-conversion-tool","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/ko\/plsql-to-javascript-udf-conversion-tool\/","title":{"rendered":"\uc624\ub77c\ud074 PL\/SQL\uc5d0\uc11c \uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 UDF\ub85c \uc27d\uac8c \uc804\ud658\ud560 \uc218 \uc788\ub294 \ub3c4\uad6c"},"content":{"rendered":"<h2><span style=\"font-weight: 400;\">PL\/SQL\uc774\ub780 \ubb34\uc5c7\uc778\uac00\uc694?<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">PL\/SQL\uc740 \uad6c\ubb38 \ub0b4\uc5d0\uc11c SQL \ubb38\uc744 \uc218\uc6a9\ud558\ub3c4\ub85d \ud2b9\ubcc4\ud788 \uc124\uacc4\ub41c \uc808\ucc28\uc801 \uc5b8\uc5b4\uc785\ub2c8\ub2e4. \uc870\uac74 \ubc0f \ub8e8\ud504\uc640 \uac19\uc740 \uc808\ucc28\uc801 \uc5b8\uc5b4 \uc694\uc18c\ub97c \ud3ec\ud568\ud558\uba70 \uc608\uc678(\ub7f0\ud0c0\uc784 \uc624\ub958)\ub97c \ucc98\ub9ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">PL\/SQL\uc740 \uc624\ub77c\ud074 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uae30\ubcf8\uc73c\ub85c \uc81c\uacf5\ub418\uba70, IBM DB2, PostgreSQL, MySQL \ub4f1\uc758 \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub294 \ud638\ud658\uc131 \uae30\ub2a5\uc744 \ud1b5\ud574 PL\/SQL \uad6c\uc131\uc744 \uc9c0\uc6d0\ud569\ub2c8\ub2e4.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">\uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 UDF\ub780 \ubb34\uc5c7\uc778\uac00\uc694?<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">JavaScript UDF\ub294 PL\/SQL\uc744 \ub300\uccb4\ud558\ub294 Couchbase\uc758 \ub300\uc548\uc785\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">JavaScript UDF\ub294 JavaScript\uc758 \ubc94\uc6a9 \uc2a4\ud06c\ub9bd\ud305 \uc720\uc5f0\uc131\uc744 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ub3c4\uc785\ud558\uc5ec \ucd5c\uc2e0 \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc2dc\uc2a4\ud15c\uc5d0\uc11c \ub3d9\uc801\uc774\uace0 \uac15\ub825\ud55c \uc791\uc5c5\uc744 \uc218\ud589\ud560 \uc218 \uc788\uac8c \ud558\uace0 \ub370\uc774\ud130 \ucffc\ub9ac, \ucc98\ub9ac \ubc0f \ubcc0\ud658\uc758 \uc720\uc5f0\uc131\uc744 \ud5a5\uc0c1\uc2dc\ud0b5\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Couchbase, \ubabd\uace0DB, \uc2a4\ub178\uc6b0\ud50c\ub808\uc774\ud06c, \uad6c\uae00 \ube45\ucffc\ub9ac \ub4f1 \ub300\ubd80\ubd84\uc758 \ucd5c\uc2e0 \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub294 \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 UDF\ub97c \uc9c0\uc6d0\ud569\ub2c8\ub2e4.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">\ubb38\uc81c<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">\uc624\ub77c\ud074\uc5d0\uc11c \uce74\uc6b0\uce58\ubca0\uc774\uc2a4\ub85c \ub9c8\uc774\uadf8\ub808\uc774\uc158\ud558\ub294 \uc0ac\uc6a9\uc790\ub4e4\uc774 \ud754\ud788 \uacaa\ub294 \ubb38\uc81c\ub294 PL\/SQL \uc2a4\ud06c\ub9bd\ud2b8\ub97c \ud3ec\ud305\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. PL\/SQL\uc744 \uc9c0\uc6d0\ud558\ub294 \ub300\uc2e0 Couchbase\uc5d0\uc11c\ub294 \uc0ac\uc6a9\uc790\uac00 JavaScript\ub85c \uc0ac\uc6a9\uc790 \uc815\uc758 \ud568\uc218\ub97c \uad6c\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4(2021\ub144\ubd80\ud130 \uc9c0\uc6d0\ub428).<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\">JavaScript UDF\ub97c \uc0ac\uc6a9\ud558\uba74 \ubcc0\ud615 \ubc0f JSON \ub370\uc774\ud130\ub97c \uc27d\uace0 \uc9c1\uad00\uc801\uc73c\ub85c \uc870\uc791\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. UDF\ub85c \uc804\ub2ec\ub41c \ubcc0\ud615 \uac1d\uccb4\ub294 \ub124\uc774\ud2f0\ube0c JavaScript \uc720\ud615\uacfc \uac12\uc73c\ub85c \ubcc0\ud658\ub429\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uc774\ub85c \uc778\ud55c \uc758\ub3c4\uce58 \uc54a\uc740 \uacb0\uacfc\ub294 \uc9c0\ub09c 10\ub144 \ub3d9\uc548 \uc874\uc7ac\ud574 \uc628 \ub300\ubd80\ubd84\uc758 RDBMS\uac00 \uac1c\ubc1c\uc790\uc5d0\uac8c \uc808\ucc28\uc801 \uad6c\uc870, SQL\uacfc\uc758 \ud1b5\ud569, \uc624\ub958 \ucc98\ub9ac, \ud568\uc218 \ubc0f \ud504\ub85c\uc2dc\uc800, \ud2b8\ub9ac\uac70, \ucee4\uc11c\ub97c \uc9c0\uc6d0\ud558\ub294 SQL\uc5d0 \ub300\ud55c \uc808\ucc28\uc801 \ud655\uc7a5(PL\/pgSQL, PL\/SQL) \ub610\ub294 \ucd5c\uc18c\ud55c \ud568\uc218 \ubc0f \ud504\ub85c\uc2dc\uc800(Sakila \uac19\uc740)\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc561\uc138\uc2a4\ud558\ub3c4\ub85d \uac15\ub825\ud788 \uad8c\uc7a5\ud574 \uc654\ub2e4\ub294 \uc810\uc785\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ubc29\uc2dd\uc5d0\uc11c \ubc97\uc5b4\ub098\ub824\uba74 \ubaa8\ub4e0 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \ub2e4\uc2dc \uc791\uc131\ud574\uc57c \ud569\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\ud2b9\ud788 2000\ub144\ub300 \uc791\uc131\ub418\uc5b4 \uadf8 \uc774\ud6c4\ub85c \uc720\uc9c0 \uad00\ub9ac\ub418\uace0 \uc788\ub294 PL\/SQL \uc2a4\ud06c\ub9bd\ud2b8\ub97c \ub2e4\ub8f0 \ub54c \ucf54\ub4dc\ub97c \ub2e4\uc2dc \uc791\uc131\ud558\ub294 \uac83\uc740 \uc9c0\ub8e8\ud55c \uc791\uc5c5\uc778 \uacbd\uc6b0\uac00 \ub9ce\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc2a4\ud06c\ub9bd\ud2b8\ub294 \ubcf5\uc7a1\ud558\uace0 \uc218\ucc9c \uc904\uc5d0 \uc774\ub974\ub294 \uacbd\uc6b0\uac00 \ub9ce\uae30 \ub54c\ubb38\uc5d0 \uc77c\ubc18 \uae30\uc5c5 \uc0ac\uc6a9\uc790\uc5d0\uac8c\ub294 \ubd80\ub2f4\uc2a4\ub7ec\uc6b8 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">\uc194\ub8e8\uc158<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">\uc774\uc0c1\uc801\uc778 \uc811\uadfc \ubc29\uc2dd\uc740 \uc644\uc804\ud788 \uc0c8\ub85c\uc6b4 PL\/SQL \ud3c9\uac00\uae30\ub97c \uac1c\ubc1c\ud558\ub294 \uac83\uc774\uc9c0\ub9cc, \uadf8\ub807\uac8c \ud558\ub824\uba74 \uacfc\ub3c4\ud55c \uc5d4\uc9c0\ub2c8\uc5b4\ub9c1 \uc2dc\uac04\uc774 \ud544\uc694\ud558\uace0 \ub3d9\uc77c\ud55c \uc0ac\uc6a9 \uc0ac\ub840\uc5d0 \ub300\ud574 \uc774\ubbf8 \ud604\ub300\uc801\uc774\uace0 \uc548\uc815\uc801\uc774\uba70 \ube60\ub978 JSEvaluator\uac00 \uc788\ub294\ub370 \uc65c \ub2e4\ub978 \ud3c9\uac00\uae30\ub97c \uc9c0\uc6d0\ud574\uc57c \ud560\uae4c\uc694?<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\ub530\ub77c\uc11c \uc774 \ubb38\uc81c\ub294 AI\uc640 LLM\uc758 \uc9c0\uc18d\uc801\uc778 \ubc1c\uc804\uc744 \ud65c\uc6a9\ud558\uae30\uc5d0 \uc644\ubcbd\ud55c \uc0ac\uc6a9 \uc0ac\ub840\uc785\ub2c8\ub2e4. \uc774\uac83\uc774 \ubc14\ub85c \uc6b0\ub9ac\uac00 \uc5ec\uae30\uc11c \ud55c \uc77c\uc785\ub2c8\ub2e4. \uc720\ub2c8\ud2f0\ub294 \uc81c\ub108\ub808\uc774\ud2f0\ube0c AI \ubaa8\ub378\uc744 \uc0ac\uc6a9\ud558\uc5ec <\/span><b>PL\/SQL\uc744 JSUDF\ub85c \ubcc0\ud658\ud558\ub294 \uc791\uc5c5 \uc790\ub3d9\ud654<\/b><span style=\"font-weight: 400;\">.<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\">2024\ub144 6\uc6d4 \uae30\uc900, <a href=\"https:\/\/platform.openai.com\/docs\/models\/gpt-4-turbo-and-gpt-4\">\ubaa8\ub378\uc5d0\ub294 \uc81c\ud55c\ub41c \ucee8\ud14d\uc2a4\ud2b8 \ucc3d\uc774 \uc788\uc2b5\ub2c8\ub2e4.<\/a>, w<\/span><span style=\"font-weight: 400;\">\uc989, PL\/SQL\uc774 \uc624\ub958\uc5d0 \ub354 \uc624\ub798 \uac78\ub9ac\uac8c \ub429\ub2c8\ub2e4:\u00a0\u00a0<\/span><\/p>\n<pre class=\"nums:false wrap:true lang:default decode:true\">\uc774 \ubaa8\ub378\uc758 \ucd5c\ub300 \ucee8\ud14d\uc2a4\ud2b8 \uae38\uc774\ub294 8192\ud1a0\ud070\uc785\ub2c8\ub2e4. \uadf8\ub7ec\ub098 \uba54\uc2dc\uc9c0\uac00  \ud1a0\ud070\uc744 \uc0dd\uc131\ud588\uc2b5\ub2c8\ub2e4. \uba54\uc2dc\uc9c0 \uae38\uc774\ub97c \uc904\uc5ec\uc8fc\uc138\uc694.<\/pre>\n<p><span style=\"font-weight: 400;\">\uc774\ub294 GPT4\uc6a9\uc774\ub77c\ub294 \uc810\uc5d0 \uc720\uc758\ud558\uc138\uc694.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uadf8\ub807\ub2e4\uba74 AI\uac00 \ub354 \uac15\ub825\ud574\uc9c0\uace0 \ub354 \ub9ce\uc740 \ud1a0\ud070\uc744 \ud5c8\uc6a9\ud560 \ub54c\uae4c\uc9c0 \uae30\ub2e4\ub824\uc57c \ud560\uae4c\uc694(\ubb34\uc5b4\uc758 \ubc95\uce59\ucc98\ub7fc AI\uc758 \ucee8\ud14d\uc2a4\ud2b8 \uae38\uc774 \ub300 \uc815\ubc00\ub3c4)?<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uc544\ub2c8\uc694, \uc5ec\uae30\ub294 <a href=\"https:\/\/www.antlr.org\/\">ANTLR<\/a>, a<\/span><span style=\"font-weight: 400;\"> \ud30c\uc11c \uc0dd\uc131\uae30 \ub3c4\uad6c\uac00 \ub4e4\uc5b4\uc635\ub2c8\ub2e4. ANTLR\uc740 \ucef4\ud30c\uc77c\ub7ec\uc640 \uc778\ud130\ud504\ub9ac\ud130 \uac1c\ubc1c\uc5d0 \uc0ac\uc6a9\ub418\ub294 \uac83\uc73c\ub85c \uc798 \uc54c\ub824\uc838 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub807\uac8c \ud558\uba74 \ud070 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \ub3c5\ub9bd\uc801\uc73c\ub85c \ubc88\uc5ed\ud560 \uc218 \uc788\ub294 \uc791\uc740 \ub2e8\uc704\ub85c \ub098\ub20c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uadf8\ub807\ub2e4\uba74 \uc774\uc81c \uc6b0\ub9ac\ub294 <\/span><b>\ud2b8\ub79c\uc2a4\ud30c\uc77c\ub7ec? <\/b><span style=\"font-weight: 400;\">\uae00\uc384\uc694, \ub9de\uae30\ub3c4 \ud558\uace0 \uc544\ub2c8\uae30\ub3c4 \ud569\ub2c8\ub2e4.<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><strong>\ud2b8\ub79c\uc2a4\ud30c\uc77c\ub7ec\uc758 \uc2a4\ud14c\uc774\uc9c0:<\/strong><\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">\uc5b4\ud718 \ubd84\uc11d(\ud1a0\ud070\ud654)<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">\uad6c\ubb38 \ubd84\uc11d(\uad6c\ubb38 \ubd84\uc11d)<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">\uc2dc\ub9e8\ud2f1 \ubd84\uc11d<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">\uc911\uac04 \ud45c\ud604(IR) \uc0dd\uc131<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">\ucd5c\uc801\ud654(\uc120\ud0dd \uc0ac\ud56d)<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">\ud0c0\uac9f \ucf54\ub4dc \uc0dd\uc131<\/span><\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<h4><strong><span style=\"font-size: 19px;\">AI \ubc88\uc5ed\uae30\uc758 \uc791\ub3d9 \ubc29\uc2dd<\/span><\/strong><\/h4>\n<p><span style=\"font-weight: 400;\">\uc704\uc758 1,2\ub2e8\uacc4\ub294 ANTLR\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc218\ud589\ub429\ub2c8\ub2e4.\u00a0<\/span><span style=\"font-weight: 400;\">ANTLR\uc758 \ub9ac\uc2a4\ub108 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub2e4\uc74c\uc744 \uc218\ud589\ud569\ub2c8\ub2e4. <\/span><b>\uac1c\ubcc4 \ud504\ub85c\uc2dc\uc800\/\ud568\uc218\/\uc775\uba85 \ube14\ub85d\uc744 \uac00\uc838\uc635\ub2c8\ub2e4.<\/b><span style=\"font-weight: 400;\">\uc640 \uac19\uc774 \ub3c5\ub9bd\uc801\uc778 \ucf54\ub4dc \ube14\ub85d\uc73c\ub85c \ubcc0\ud658\ud569\ub2c8\ub2e4. \ud504\ub85c\uc2dc\uc800\/\ud568\uc218\/\uc775\uba85 \ube14\ub85d \uc790\uccb4\uac00 \ucee8\ud14d\uc2a4\ud2b8 \ucc3d\uc744 \ucd08\uacfc\ud558\ub294 \uacbd\uc6b0\uc5d0\ub294 \ubb38 \uc218\uc900\uc5d0\uc11c \ubc88\uc5ed\ud569\ub2c8\ub2e4(\uc5ec\uae30\uc5d0\ub294 \uc815\uc758\ub418\uc9c0 \uc54a\uc558\uc9c0\ub9cc \uc774\uc804 \uc5b4\ub518\uac00\uc5d0 \ubcc0\uc218\/\ud568\uc218 \ud638\ucd9c\uc758 \uc0ac\uc6a9\uc774 \uc874\uc7ac\ud55c\ub2e4\uace0 LLM\uc774 \uac00\uc815\ud558\ub294 \uacbd\uc6b0).<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uadf8 \ud6c4 3, 4, 5, 6\ub2e8\uacc4, \uc989 \uac01 PL\/SQL \ube14\ub85d\uc744 \ube14\ub85d\uc758 \uc791\ub3d9 \uc758\ubbf8\ub97c \ubcf4\uc874\ud558\uace0 \uad6c\ubb38\uc801\uc73c\ub85c \uc815\ud655\ud55c JavaScript \ud568\uc218\ub85c \ucd5c\ub300\ud55c \ubcc0\ud658\ud558\ub294 \uc791\uc5c5\uc740 LLM(\uc608: GPT)\uc5d0 \ub9e1\uae41\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uacb0\uacfc\ub294 \ub180\ub78d\uac8c\ub3c4 \ub9e4\uc6b0 \uae0d\uc815\uc801\uc774\uc5c8\uc2b5\ub2c8\ub2e4. \ubc88\uc5ed \uc815\ud655\ub3c4\ub294 80-85%\uc785\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uc774 \uc194\ub8e8\uc158\uc758 \ub610 \ub2e4\ub978 \uc7a5\uc810\uc740 \ud55c \ubc88\uc5d0 \ud55c \uac00\uc9c0 \uc791\uc5c5\uc5d0 \uc9d1\uc911\ud568\uc73c\ub85c\uc368 \uc7a1\ub150\uc744 \uc904\uc5ec \ubcf4\ub2e4 \uc815\ud655\ud55c \ubc88\uc5ed\uc744 \ud560 \uc218 \uc788\ub2e4\ub294 \uc810\uc785\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uc2dc\uac01\ud654\ud558\ub824\uba74:<\/span><\/p>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/02\/image1-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-16847 size-large\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/02\/image1-1-1024x904.png\" alt=\"automate the conversion of PL\/SQL to JSUDF\" width=\"900\" height=\"795\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/02\/image1-1-1024x904.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/02\/image1-1-300x265.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/02\/image1-1-768x678.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/02\/image1-1-1536x1356.png 1536w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/02\/image1-1-1320x1166.png 1320w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/02\/image1-1.png 1787w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<h2><span style=\"font-weight: 400;\">\ub3c4\uad6c \uc0ac\uc6a9 \ubc29\ubc95<\/span><\/h2>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li><span style=\"font-weight: 400;\">\ub2e4\uc74c\uc5d0\uc11c \uc2e4\ud589 \ud30c\uc77c\uc744 \ub2e4\uc6b4\ub85c\ub4dc\ud558\uc138\uc694. <a href=\"https:\/\/github.com\/couchbaselabs\/plsql-to-jsudf2\/releases\/tag\/v1.0.0\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ub7a9 \uae43\ud5c8\ube0c<\/a> \ub97c \ud074\ub9ad\ud558\uace0 <a href=\"https:\/\/github.com\/couchbaselabs\/plsql-to-jsudf2\/blob\/master\/README.md\">README<\/a>.<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">\uc2e4\ud589 \ud30c\uc77c\uc740 \ub2e4\uc74c\uacfc \uac19\uc740 \uba85\ub839\uc904 \uc778\uc218\ub97c \uae30\ub300\ud569\ub2c8\ub2e4:<\/span><\/p>\n<p style=\"padding-left: 40px;\"><span style=\"font-weight: 400;\">-u: \uce74\ud3a0\ub77c \ub85c\uadf8\uc778 \uc774\uba54\uc77c<br \/>\n<\/span><span style=\"font-weight: 400;\">-p: \uce74\ud3a0\ub77c \ub85c\uadf8\uc778 \ube44\ubc00\ubc88\ud638<br \/>\n<\/span><span style=\"font-weight: 400;\">-cpaddr: \ucc44\ud305-\uc644\uc131 API\uc6a9 \uce74\ud3a0\ub77c URL<br \/>\n<\/span><span style=\"font-weight: 400;\">-orgid: \ucc44\ud305 \uc644\ub8cc API \uacbd\ub85c\uc758 \uc870\uc9c1 ID<br \/>\n<\/span><span style=\"font-weight: 400;\">-cbhost: \ub178\ub4dc-ip: cbcluster \ub178\ub4dc<br \/>\n<\/span><span style=\"font-weight: 400;\">-cbuser: \ud074\ub7ec\uc2a4\ud130-\uc0ac\uc6a9\uc790 \uc774\ub984: \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc561\uc138\uc2a4\ub97c \ud1b5\ud574 \ucd94\uac00\ub41c cbcluster \uc0ac\uc6a9\uc790<br \/>\n<\/span><span style=\"font-weight: 400;\">-cbpassword: \ud074\ub7ec\uc2a4\ud130-\uc554\ud638: \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uc561\uc138\uc2a4\ub97c \ud1b5\ud574 \ucd94\uac00\ub41c cb\ud074\ub7ec\uc2a4\ud130 \uc554\ud638<br \/>\n<\/span><span style=\"font-weight: 400;\">-cbport: \ucffc\ub9ac \uc11c\ube44\uc2a4 tls \ud3ec\ud2b8: \ubcf4\ud1b5 18093<br \/>\n<\/span><span style=\"font-weight: 400;\">\ud30c\uc77c \uacbd\ub85c , \uc989 \ubc88\uc5ed\ud574\uc57c \ud558\ub294 PL\/SQL \uc2a4\ud06c\ub9bd\ud2b8\uc758 \uacbd\ub85c\uc785\ub2c8\ub2e4.<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\">\ucd9c\ub825-&gt;\u00a0<\/span><span style=\"font-weight: 400;\">\ucd9c\ub825 \ub514\ub809\ud130\ub9ac\uc5d0\uc11c \uc774\ub984\uc774 \uac19\uc740 \ud30c\uc77c\uc774 <em>plsql<\/em> \ud30c\uc77c\uc740 \ubc88\uc5ed\ub41c \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \ub77c\uc774\ube0c\ub7ec\ub9ac \ucf54\ub4dc\ub85c \uc0dd\uc131\ub429\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uc608\uc2dc\uc785\ub2c8\ub2e4:<\/span><\/p>\n<p><code>cat example1.sql<\/code><\/p>\n<pre class=\"nums:false lang:default decode:true\">DECLARE\r\n   x NUMBER := 0;\r\n   \uce74\uc6b4\ud130 NUMBER := 0;\r\nBEGIN\r\n   FOR i IN 1..4 LOOP\r\n      x := x + 1000;\r\n      \uce74\uc6b4\ud130 := \uce74\uc6b4\ud130 + 1;\r\n      INSERT INTO temp VALUES (x, counter, 'in OUTER loop');\r\n       --\ub0b4\ubd80 \ube14\ub85d \uc2dc\uc791\r\n      DECLARE\r\n         x NUMBER := 0; -- \uc774\uac83\uc740 x\uc758 \ub85c\uceec \ubc84\uc804\uc785\ub2c8\ub2e4.\r\n      BEGIN\r\n         FOR i IN 1..4 LOOP\r\n            x := x + 1; -- \uc774\uac83\uc740 \ub85c\uceec x\ub97c \uc99d\uac00\uc2dc\ud0a8\ub2e4.\r\n            \uce74\uc6b4\ud130 := \uce74\uc6b4\ud130 + 1;\r\n            INSERT INTO temp VALUES (x, counter, '\ub0b4\ubd80 \ub8e8\ud504');\r\n         END LOOP;\r\n      END;\r\n   END LOOP;\r\n   COMMIT;\r\nEND;<\/pre>\n<p><span style=\"font-weight: 400;\">\uc704\uc758 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uac04\ub2e8\ud788 \uc124\uba85\ud569\ub2c8\ub2e4:<\/span><\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li><span style=\"font-weight: 400;\">\uc678\ubd80 \ub8e8\ud504\ub294 x\ub97c 1000\uc529 \uc99d\uac00\uc2dc\ud0a4\uace0 \uce74\uc6b4\ud130\ub97c 1\uc529 \uc99d\uac00\uc2dc\ud0a4\uba74\uc11c 4\ud68c \ubc18\ubcf5 \uc2e4\ud589\ub429\ub2c8\ub2e4.<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><\/li>\n<li><span style=\"font-weight: 400;\">\ub0b4\ubd80 \ub8e8\ud504\ub294 x\ub97c 1\uc529 \uc99d\uac00\uc2dc\ud0a4\uace0 \uce74\uc6b4\ud130\ub97c 1\uc529 \uc99d\uac00\uc2dc\ud0a4\uba74\uc11c 4\ud68c \ubc18\ubcf5 \uc2e4\ud589\ub429\ub2c8\ub2e4.<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">\ud14c\uc2a4\ud2b8 PL\/SQL\uc5d0\uc11c \ubc88\uc5ed\uae30\ub97c \uc2e4\ud589\ud569\ub2c8\ub2e4:<\/span><\/p>\n<pre class=\"nums:false wrap:true lang:default decode:true\">.\/plsql-to-jsudf -u \"capella-signin-mailid\" -p \"capella-signin-password\" -cpaddr https:\/\/api.cloud.couchbase.com -orgid \"capella-organisation-id\" -cbhost \"\ub370\uc774\ud130 \ub178\ub4dc \ud638\uc2a4\ud2b8 \uc774\ub984\" -cbuser \"cbcluster \uc0ac\uc6a9\uc790 \uc774\ub984\" -cbpassword \"cbcluster \ube44\ubc00\ubc88\ud638\" -cbport 18093 .\/translator\/test\/plsql\/example1.sql\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">JSUDF\ub97c \ucd9c\ub825\ud569\ub2c8\ub2e4:<\/span><\/p>\n<p><span style=\"font-weight: 400;\"><code>cat output\/example1.js<\/code><\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><\/p>\n<pre class=\"nums:false wrap:true lang:js decode:true\">\ud568\uc218 nestedloop(){\r\n    var x = 0;\r\n    var counter = 0;\r\n    var querybegin = BEGIN WORK;\r\n    querybegin.close();\r\n    for (var i = 1; i &lt;= 4; i++){\r\n        x = x + 1000;\r\n        \uce74\uc6b4\ud130 = \uce74\uc6b4\ud130 + 1;\r\n        var params = [x, counter];\r\n        var query = N1QL(&#039;INSERT INTO test.testscope.temp VALUES (uuid(),{&quot;val1&quot;:$1,&quot;val2&quot;:$2,&quot;val3&quot;:&quot;in OUTER loop&quot;})&#039;,params);\r\n        query.close();\r\n        var x_inner = 0;\r\n        for (var j = 1; j &lt;= 4; j++){}\r\n            x_inner = x_inner + 1;\r\n            \uce74\uc6b4\ud130 = \uce74\uc6b4\ud130 + 1;\r\n            var params_inner = [x_inner, counter];\r\n            var query_inner = N1QL(&#039;INSERT INTO test.testscope.temp VALUES (uuid(),{&quot;val1&quot;:$1,&quot;val2&quot;:$2,&quot;val3&quot;:&quot;\ub0b4\ubd80 \ub8e8\ud504&quot;})&#039;,params_inner);\r\n            query_inner.close();\r\n        }\r\n    }\r\n    var querycommit = \ucee4\ubc0b \uc791\uc5c5;\r\n    querycommit.close();\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">\ubc88\uc5ed\ub41c \uc2a4\ud06c\ub9bd\ud2b8\uc5d0\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \ud568\uc218\uac00 \uc788\uc2b5\ub2c8\ub2e4. <em>nestedloop<\/em> (LLM\uc5d0 \uc758\ud574 \uc0dd\uc131\ub41c \uc774\ub984)\uc740 \uc6d0\ub798 \uc775\uba85 PL\/SQL \ube14\ub85d\uc774 \uc9c0\uc815\ud55c \ub300\ub85c \uc815\ud655\ud558\uac8c \uc218\ud589\ud569\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\ucc38\uace0: \uba85\uba85\ub41c \ud568\uc218\/\ud504\ub85c\uc2dc\uc800\uc758 \uacbd\uc6b0 \ubc88\uc5ed\ub41c JS \ud568\uc218\ub294 \ub3d9\uc77c\ud55c \uc774\ub984\uc744 \uac16\uc2b5\ub2c8\ub2e4.  \uc775\uba85 \ube14\ub85d\uc758 \uacbd\uc6b0 LLM\uc740 \uc790\uccb4\uc801\uc73c\ub85c \uc0dd\uc131\ud55c \uc774\ub984\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">\uc54c\ub824\uc9c4 \ubb38\uc81c<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">PL\/SQL\uacfc JS\ub294 \uc11c\ub85c \ub2e4\ub978 \ub450 \uac00\uc9c0 \uc5b8\uc5b4\uc774\uba70, Oracle\uacfc Couchbase\uc5d0\uc11c \uc9c0\uc6d0\ub418\ub294 \ubc29\uc2dd\uc740 \ub450 \uc5b8\uc5b4 \uac04\uc5d0 \uae54\ub054\ud55c \uc9c1\uc811 \ub9e4\ud551\uc744 \ud5c8\uc6a9\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.\u00a0<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\ub2e4\uc74c\uc740 \uc800\ud76c\uac00 \ubc1c\uacac\ud55c \uba87 \uac00\uc9c0 \uc81c\ud55c \uc0ac\ud56d\uacfc \uc774\ub97c \ud574\uacb0\ud558\uae30 \uc704\ud574 \uad6c\ud604\ud55c \ud574\uacb0 \ubc29\ubc95\uc785\ub2c8\ub2e4:<\/span><\/p>\n<h4><span style=\"font-weight: 400;\">\ucf58\uc194 \ub85c\uadf8\uac00 \uc9c0\uc6d0\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/span><\/h4>\n<p><span style=\"font-weight: 400;\"><em>dbms_output.put<\/em> \uae30\ubcf8 \uc81c\uacf5 \ud504\ub85c\uc2dc\uc800 \ubc0f \uae30\ud0c0 2\uac1c\uc758 \uc720\uc0ac\ud55c \uae30\ubcf8 \uc81c\uacf5 \ud504\ub85c\uc2dc\uc800\uac00 \uc788\uc2b5\ub2c8\ub2e4, <em>dbms_output.put_line<\/em> \uadf8\ub9ac\uace0 <em>dbms_output.new_line<\/em> \uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \ubc88\uc5ed\ub429\ub2c8\ub2e4. <em>console.log()<\/em>\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc9c0\ub9cc console.log\ub294 \ube0c\ub77c\uc6b0\uc800 API\uc774\uba70 Couchbase\uc758 JavaScript \ud3c9\uac00 \uad6c\ud604\uc5d0\uc11c\ub294 \uc9c0\uc6d0\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. Couchbase \uc774\ubca4\ud2b8 \ud568\uc218\uac00 \ub2e4\uc74c\uc744 \uc9c0\uc6d0\ud55c\ub2e4\ub294 \uc810\uc744 \uace0\ub824\ud560 \ub54c \uc774 \ubb38\uc81c\ub294 \uc790\uc8fc \uc694\uccad\ub418\uc5b4 \uc654\uc2b5\ub2c8\ub2e4. <em>print()<\/em> \ubb38\uc5d0\ub294 \uc788\uc9c0\ub9cc \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 UDF\uc5d0\ub294 \uc5c6\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p><b>\ud574\uacb0 \ubc29\ubc95:<\/b><\/p>\n<p><span style=\"font-weight: 400;\">\uc0ac\uc6a9\uc790\ub294 <em>\ub85c\uae45<\/em>\u00a0\ubc84\ud0b7.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Logs are inserted as part of a document INSERT into `default`.`default` collection. The document would look something like:<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\">{\r\n   \"udf\": \"func-name\",\r\n   \"log\": \"console.log\uc5d0 \ub300\ud55c \uc778\uc218\", \/\/ \uc2e4\uc81c \ub85c\uadf8 \ud589\r\n   \"time\": \"\ud604\uc7ac ISO \uc2dc\uac04 \ubb38\uc790\uc5f4\"\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">\uc0ac\uc6a9\uc790\ub294 \ub85c\uae45\uc744 \uc120\ud0dd\ud558\uc5ec \uc790\uc2e0\uc758 \ub85c\uadf8\ub97c \uc870\ud68c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4:<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\">SELECT * FROM logging WHERE udf= \"\"func-name\"\";\r\nSELECT * FROM logging WHERE time BETWEEN \"\"date1\"\" AND \"\"date2\"\";\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">\uc608\uc2dc\uc785\ub2c8\ub2e4:<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uc624\ub9ac\uc9c0\ub110 PL\/SQL<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\">BEGIN\r\n   DBMS.OUTPUT.PUT(\"Hello world!\");\r\nEND;<\/pre>\n<p><span style=\"font-weight: 400;\">JavaScript UDF\ub85c \ubc88\uc5ed\ub428<\/span><\/p>\n<pre class=\"nums:false lang:js decode:true\">\ud568\uc218 helloWorld() {\r\n   \/\/ console.log(\"\uc548\ub155\ud558\uc138\uc694!\")\uc5d0 \ub300\ud55c \ud574\uacb0 \ubc29\ubc95;\r\n   var currentDate = new Date();\r\n   var utcISOString = currentDate.toISOString();\r\n   var params = [utcISOString,'anonymousblock1',\"\uc548\ub155\ud558\uc138\uc694!\"];\r\n   var logquery = N1QL('INSERT INTO logging VALUES(UUID(),{\"udf\":$2,\"log\":$3,\"time\":$1}, {\"expiration\": 5*24*60*60 })', params);\r\n   logquery.close();\r\n}\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">\uc774\ub294 \uc774\ubbf8 \ub3c4\uad6c\uc5d0 \uad6c\ud604\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\">\ub85c\uadf8\ub97c \ubcf4\ub824\uba74 \ub2e4\uc74c\uacfc \uac19\uc774 \ud558\uc138\uc694:<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\">\ud5ec\ub85c\uc6d4\ub4dc() \ud568\uc218\ub97c \uc2e4\ud589\ud569\ub2c8\ub2e4;\r\n\"results\": [\r\n   null\r\n]\r\n\r\n\ub85c\uae45 \uc2dc \uae30\ubcf8 \uc778\ub371\uc2a4\ub97c \uc0dd\uc131\ud569\ub2c8\ub2e4;\r\n\"results\": [\r\n]\r\n\r\nSELECT * FROM logging;\r\n\"results\": [\r\n   {\"logging\":{\"log\":\"Hello world!\",\"time\":\"2024-06-26T09:20:56.000Z\",\"udf\":\"anonymousblock1\"}}\r\n]<\/pre>\n<h4><span style=\"font-weight: 400;\">2. \uad50\ucc28 \ud328\ud0a4\uc9c0 \ud568\uc218 \ud638\ucd9c<\/span><\/h4>\n<p><span style=\"font-weight: 400;\">\ud328\ud0a4\uc9c0 \uc0ac\uc591\uc5d0 \ub098\uc5f4\ub41c \ud504\ub85c\uc2dc\uc800\/\ud568\uc218\ub294 \uc804\uc5ed\uc774\uba70, \ub2e4\ub978 \ud328\ud0a4\uc9c0\uc5d0\uc11c \ub2e4\uc74c\uc744 \ud1b5\ud574 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <em>\"\ud328\ud0a4\uc9c0_\uc774\ub984\".\"\uacf5\uac1c_\ud504\ub85c\uc2dc\uc800\/\ud568\uc218\"<\/em>. \uadf8\ub7ec\ub098 \uac00\uc838\uc624\uae30-\ub0b4\ubcf4\ub0b4\uae30 \uad6c\ubb38\uc740 CouchBase\uc758 JavaScript \ud3c9\uac00 \uad6c\ud604\uc5d0\uc11c \uc9c0\uc6d0\ub418\uc9c0 \uc54a\uc73c\ubbc0\ub85c CouchBase\uc758 JavaScript \ub77c\uc774\ube0c\ub7ec\ub9ac\uc5d0\uc11c\ub3c4 \ub9c8\ucc2c\uac00\uc9c0\uc785\ub2c8\ub2e4.<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><b>\ud574\uacb0 \ubc29\ubc95:<\/b><b><\/b><\/p>\n<p><span style=\"font-weight: 400;\">\ub77c\uc774\ube0c\ub7ec\ub9ac \uac04 \ud568\uc218 \ud638\ucd9c\uc758 \uacbd\uc6b0<em> \"lib_name\".\"function\"()<\/em>\ub97c \uc0ac\uc6a9\ud558\uba74 \uc0ac\uc6a9\uc790\ub294 \ucc38\uc870\ub41c \ub77c\uc774\ube0c\ub7ec\ub9ac\uac00 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. <em>\"lib_name\"<\/em> \uc774\ubbf8 \uc0dd\uc131\ub41c \uacbd\uc6b0 \ub2e4\uc74c\uc744 \ud1b5\ud574 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <em>GET \/evaluator\/v1\/libraries<\/em><\/span><\/p>\n<p><span style=\"font-size: 19px;\">\ucc38\uc870\ub41c \ud568\uc218 <em>\"function\"<\/em> \ub610\ud55c \uae00\ub85c\ubc8c UDF\ub85c \uc0dd\uc131\ub420 \uac83\uc73c\ub85c \uc608\uc0c1\ub418\uba70, \uc774\ub294 GET \/admin\/functions_cache\ub97c \ud1b5\ud574 \ud655\uc778\ud558\uac70\ub098 system:functions \ud0a4\uc2a4\ud398\uc774\uc2a4\ub97c \uc120\ud0dd\ud558\uc5ec \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub807\uac8c \ud558\uba74 SQL++\/N1QL\uc744 \ud1b5\ud574 \ud568\uc218\uc5d0 \uc561\uc138\uc2a4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uc608\uc2dc\uc785\ub2c8\ub2e4:<\/span><\/p>\n<p><span style=\"font-weight: 400;\"><em>\uc218\ud559_\uc720\ud2f8<\/em> \ud328\ud0a4\uc9c0<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\">\ud328\ud0a4\uc9c0 math_utils\ub97c \ub2e4\uc74c\uacfc \uac19\uc774 \uc0dd\uc131 \ub610\ub294 \uad50\uccb4\ud569\ub2c8\ub2e4.\r\n   -- \ub450 \uac1c\uc758 \uc22b\uc790\ub97c \ub354\ud558\ub294 \uacf5\uc6a9 \ud568\uc218\r\n   FUNCTION add_numbers(p_num1 NUMBER, p_num2 NUMBER) RETURN NUMBER;\r\nEND math_utils;\r\n\/\r\n\r\nCREATE OR REPLACE PACKAGE BODY math_utils AS\r\n   FUNCTION add_numbers(p_num1 NUMBER, p_num2 NUMBER) RETURN NUMBER IS\r\n      BEGIN\r\n         RETURN p_num1 + p_num2;\r\n      END add_numbers;\r\nEND math_utils;\r\n\/\r\n<\/pre>\n<p><span style=\"font-weight: 400;\"><em>show_sum<\/em> \ud328\ud0a4\uc9c0<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\">CREATE OR REPLACE PACKAGE show_sum AS\r\n   -- \ub450 \uc22b\uc790\uc758 \ud569\uacc4\ub97c \ud45c\uc2dc\ud558\ub294 \uacf5\uac1c \ud504\ub85c\uc2dc\uc800\r\n   PROCEDURE display_sum(p_num1 NUMBER, p_num2 NUMBER);\r\nEND show_sum;\r\n\/\r\n\r\n\ud328\ud0a4\uc9c0 \ubcf8\ubb38 show_sum AS \uc0dd\uc131 \ub610\ub294 \uad50\uccb4\r\n   PROCEDURE display_sum(p_num1 NUMBER, p_num2 NUMBER) IS\r\n      v_sum NUMBER;\r\n   BEGIN\r\n      -- math_utils \ud328\ud0a4\uc9c0\uc5d0\uc11c add_numbers \ud568\uc218 \ud638\ucd9c\ud558\uae30\r\n      v_sum := math_utils.add_numbers(p_num1, p_num2);\r\n\r\n      -- DBMS_OUTPUT.PUT_LINE\uc744 \uc0ac\uc6a9\ud558\uc5ec \ud569\uacc4 \ud45c\uc2dc\ud558\uae30\r\n      DBMS_OUTPUT.PUT_LINE('' || p_num1 || ' \ubc0f ' || p_num2 || ' \uc758 \ud569\uacc4\ub294 ' || v_sum\uc785\ub2c8\ub2e4');\r\n   END display_sum;\r\nEND show_sum;\r\n\/<\/pre>\n<p><span style=\"font-weight: 400;\">\ubc88\uc5ed\ub41c \ucf54\ub4dc:<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><\/p>\n<pre class=\"nums:false lang:js decode:true\">\ud568\uc218 show_sum(a, b) {\r\n var sum_result;\r\n\r\n\/\/ \ud06c\ub85c\uc2a4 \ub77c\uc774\ube0c\ub7ec\ub9ac \ud568\uc218 \ud638\ucd9c\uc744 \uc704\ud55c \ud574\uacb0 \ubc29\ubc95 math_utils.add_numbers(a, b)\r\nvar crossfunc = N1QL(\"EXECUTE FUNCTION add_numbers($1,$2)\",[a, b])\r\nvar crossfuncres = []\r\nfor(const doc of crossfunc) {\r\n   crossfuncres.push(doc);\r\n}\r\n\r\n\/\/ math_utils.add_numbers(a, b)\uc758 \uc2e4\uc81c \ub300\uccb4 \ud568\uc218\r\nsum_result = crossfuncres[0];\r\n\r\n\/\/ console.log('' + a + ' \ubc0f ' + b + ' \uc758 \ud569\uacc4\ub294: ' + sum_result);\r\nvar currentDate = \uc0c8\ub85c\uc6b4 Date();\r\nvar utcISOString = currentDate.toISOString();\r\nvar params = [utcISOString,'SHOW_SUM','' + a + ' \ubc0f ' + b + ' \uc758 \ud569\uacc4\ub294: ' + sum_result];\r\nvar logquery = N1QL('INSERT INTO logging VALUES(UUID(),{\"udf\":$2,\"log\":$3,\"time\":$1}, {\"expiration\": 5*24*60*60 })', params);\r\nlogquery.close();\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">\ud504\ub85c\uadf8\ub7a8\uc5d0 \uc758\ud574 \uc790\ub3d9\uc73c\ub85c \ucc98\ub9ac\ub418\uba70, \uc0ac\ub78c\uc758 \ub208\uc73c\ub85c \ud655\uc778\ud574\uc57c \ud55c\ub2e4\ub294 \uacbd\uace0\uac00 \ud45c\uc2dc\ub429\ub2c8\ub2e4!<\/span><\/p>\n<h4><span style=\"font-weight: 400;\">3. \uae00\ub85c\ubc8c \ubcc0\uc218<\/span><\/h4>\n<p><span style=\"font-weight: 400;\">PL\/SQL\uc740 \ud328\ud0a4\uc9c0 \uc218\uc900 \ubc0f \uc138\uc158 \uc218\uc900 \uc804\uc5ed \ubcc0\uc218\ub97c \uc9c0\uc6d0\ud558\uc9c0\ub9cc, \uba54\ubaa8\ub9ac \ub204\uc218\uac00 \uc6b0\ub824\ub418\ub294 \uc804\uc5ed \ubcc0\uc218\ub294 JSUDF\uc5d0\uc11c \uc758\ub3c4\uc801\uc73c\ub85c \uc9c0\uc6d0\ub418\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uc81c\uc548\ub41c \ud574\uacb0 \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud558\ub824\uba74 \uc0dd\uc131\ub41c \ubc88\uc5ed\uc744 \uc218\ub3d9\uc73c\ub85c \uc870\uc815\ud574\uc57c \ud569\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\">  \uae00\ub85c\ubc8c \ubcc0\uc218 \ud328\ud0a4\uc9c0\ub97c \ub2e4\uc74c\uacfc \uac19\uc774 \ub9cc\ub4e4\uac70\ub098 \ubc14\uafc9\ub2c8\ub2e4.\r\n     -- \uc804\uc5ed \ubcc0\uc218 \uc120\uc5b8\r\n     g_counter NUMBER := 0;\r\n     g_message VARCHAR2(100) := '\ucd08\uae30 \uba54\uc2dc\uc9c0';\r\n\r\n     -- \uacf5\uc6a9 \ud504\ub85c\uc2dc\uc800 \uc120\uc5b8\r\n     PROCEDURE increment_counter;\r\n     PROCEDURE set_message(p_message VARCHAR2);\r\n     PROCEDURE show_globals;\r\n   END global_vars_pkg;\r\n   \/\r\n\r\n   CREATE OR REPLACE PACKAGE BODY global_vars_pkg AS\r\n\r\n     -- \uce74\uc6b4\ud130\ub97c \uc99d\uac00\uc2dc\ud0a4\ub294 \ud504\ub85c\uc2dc\uc800\r\n     PROCEDURE increment_counter IS\r\n     BEGIN\r\n       g_counter := g_counter + 1;\r\n     END increment_counter;\r\n\r\n     -- \uae00\ub85c\ubc8c \uba54\uc2dc\uc9c0\ub97c \uc124\uc815\ud558\ub294 \ud504\ub85c\uc2dc\uc800\r\n     PROCEDURE set_message(p_message VARCHAR2) IS\r\n     BEGIN\r\n       g_message := p_message;\r\n     END set_message;\r\n\r\n     -- \uc804\uc5ed \ubcc0\uc218\uc758 \ud604\uc7ac \uac12\uc744 \ud45c\uc2dc\ud558\ub294 \ud504\ub85c\uc2dc\uc800\r\n     PROCEDURE show_globals IS\r\n     BEGIN\r\n       DBMS_OUTPUT.PUT_LINE('g_counter = ' || g_counter);\r\n       DBMS_OUTPUT.PUT_LINE('g_message = ' || g_message);\r\n     END show_global;\r\n\r\n   END global_vars_pkg;\r\n   \/<\/pre>\n<p><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\">\uc804\uc5ed \ubcc0\uc218\ub97c \uc218\uc815\ud558\ub294 \ubaa8\ub4e0 \ud568\uc218\ub294 \uc774\ub97c \uc778\uc218\ub85c \ubc1b\uc544 \ud638\ucd9c\uc790\uc5d0\uac8c \ubc18\ud658\ud574\uc57c \ud569\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-size: 19px;\"><em>increment_counter<\/em>:<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\">\ud568\uc218 increment_counter(counter){\r\n   \uce74\uc6b4\ud130 = \uce74\uc6b4\ud130 + 1;\r\n   \ubc18\ud658 \uce74\uc6b4\ud130\r\n}\r\n<\/pre>\n<p><span style=\"font-weight: 400;\">\uc804\uc5ed\ub9cc \uc77d\ub294 \ubaa8\ub4e0 \ud568\uc218\ub294 \uc774\ub97c \uc778\uc218\ub85c \ubc1b\uc544\ub4e4\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\"><em>show_global<\/em>:<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\">function show_globals(counter, message){{\r\n   \/\/ console.log(counter)\uc5d0 \ub300\ud55c \ud574\uacb0 \ubc29\ubc95;\r\n   var currentDate = new Date();\r\n   var utcISOString = currentDate.toISOString();\r\n   var params = [utcISOString,'SHOW_GLOBALS',couter];\r\n   var logquery = N1QL('INSERT INTO logging VALUES(UUID(),{\"udf\":$2,\"log\":$3,\"time\":$1}, {\"expiration\": 5*24*60*60 })', params);\r\n   logquery.close();\r\n\r\n   \/\/ console.log(message)\uc5d0 \ub300\ud55c \ud574\uacb0 \ubc29\ubc95;\r\n   var currentDate = \uc0c8\ub85c\uc6b4 Date();\r\n   var utcISOString = currentDate.toISOString();\r\n   var params = [utcISOString,'SHOW_GLOBALS',message];\r\n   var logquery = N1QL('INSERT INTO logging VALUES(UUID(),{\"udf\":$2,\"log\":$3,\"time\":$1}, {\"expiration\": 5*24*60*60 })', params);\r\n   logquery.close();\r\n}\r\n<\/pre>\n<h3><span style=\"font-weight: 400;\">\ub77c\uc774\ube0c\ub7ec\ub9ac\ub85c \ud328\ud0a4\uc9c0 \ubcf4\ub0b4\uae30<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">\uc774 \uc139\uc158\uc5d0\uc11c\ub294 \ub3c4\uad6c\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc5d4\ub4dc\ud22c\uc5d4\ub4dc \ud328\ud0a4\uc9c0\uc5d0\uc11c \ub77c\uc774\ube0c\ub7ec\ub9ac\ub85c \ubcc0\ud658\ud558\ub294 \ubc29\ubc95\uc744 \ubcf4\uc5ec \uc90d\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uc0d8\ud50c PL\/SQL \ud328\ud0a4\uc9c0:<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\">\ud328\ud0a4\uc9c0 \uc0dd\uc131 \ub610\ub294 \uad50\uccb4 emp_pkg IS\r\n  PROCEDURE insert_employee(\r\n    p_emp_id IN employees.emp_id%TYPE,\r\n    p_first_name IN employees.first_name%TYPE,\r\n    p_last_name IN employees.last_name%TYPE,\r\n    p_salary IN employees.salary%TYPE\r\n  );\r\n\r\n  PROCEDURE update_employee(\r\n    p_emp_id IN employees.emp_id%TYPE,\r\n    p_first_name IN employees.first_name%TYPE,\r\n    p_last_name IN employees.last_name%TYPE,\r\n    p_salary IN employees.salary%TYPE\r\n  );\r\n\r\n  PROCEDURE delete_employee(\r\n    p_emp_id IN employees.emp_id%TYPE\r\n  );\r\n\r\n  PROCEDURE get_employee(\r\n    p_emp_id IN employees.emp_id%TYPE,\r\n    p_first_name OUT employees.first_name%TYPE,\r\n    p_last_name OUT employees.last_name%TYPE,\r\n    p_salary OUT employees.salary%TYPE\r\n  );\r\n\r\nEND emp_pkg;\r\n\/\r\n\r\nCREATE OR REPLACE PACKAGE BODY emp_pkg IS\r\n  PROCEDURE insert_employee(\r\n    p_emp_id IN employees.emp_id%TYPE,\r\n    p_first_name IN employees.first_name%TYPE,\r\n    p_last_name IN employees.last_name%TYPE,\r\n    p_salary IN employees.salary%TYPE\r\n  ) IS\r\n\r\n  BEGIN\r\n    INSERT INTO employees (emp_id, first_name, last_name, salary)\r\n    VALUES (p_emp_id, p_first_name, p_last_name, p_salary);\r\n  END insert_employee;\r\n\r\n  PROCEDURE update_employee(\r\n    p_emp_id IN employees.emp_id%TYPE,\r\n    p_first_name IN employees.first_name%TYPE,\r\n    p_last_name IN employees.last_name%TYPE,\r\n    p_salary IN employees.salary%TYPE\r\n  ) IS\r\n\r\n  BEGIN\r\n    UPDATE employees\r\n    SET first_name = p_first_name,\r\n        \uc131 = p_last_name,\r\n        \uae09\uc5ec = p_salary\r\n    WHERE emp_id = p_emp_id;\r\n  END update_employee;\r\n\r\n  PROCEDURE delete_employee(\r\n    p_emp_id IN employees.emp_id%TYPE\r\n  ) IS\r\n\r\n  BEGIN\r\n    DELETE FROM employees\r\n    WHERE emp_id = p_emp_id;\r\n  END delete_employee;\r\n\r\n  PROCEDURE get_employee(\r\n    p_emp_id IN employees.emp_id%TYPE,\r\n    p_first_name OUT employees.first_name%TYPE,\r\n    p_last_name OUT employees.last_name%TYPE,\r\n    p_salary OUT employees.salary%TYPE\r\n  ) IS\r\n\r\n  BEGIN\r\n    SELECT first_name, last_name, salary\r\n    INTO p_first_name, p_last_name, p_salary\r\n    FROM employees\r\n    WHERE emp_id = p_emp_id;\r\n  END get_employee;\r\nEND emp_pkg;\r\n\/<\/pre>\n<p><span style=\"font-weight: 400;\">\ubc88\uc5ed:<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><\/p>\n<pre class=\"nums:false wrap:true lang:default decode:true\">.\/plsql-to-jsudf -u \"capella-signin-mailid\" -p \"capella-signin-password\" -cpaddr https:\/\/api.cloud.couchbase.com -orgid \"capella-organisation-id\" -cbhost \"\ub370\uc774\ud130 \ub178\ub4dc \ud638\uc2a4\ud2b8 \uc774\ub984\" -cbuser \"cbcluster \uc0ac\uc6a9\uc790 \uc774\ub984\" -cbpassword \"cbcluster \ube44\ubc00\ubc88\ud638\" -cbport 18093 translator\/test\/plsql\/blog_test.sql<\/pre>\n<p><span style=\"font-weight: 400;\">Code:<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><\/p>\n<pre class=\"nums:false lang:js decode:true\">function insert_employee(p_emp_id, p_first_name, p_last_name, p_salary){{\r\n    var params = [p_emp_id, p_first_name, p_last_name, p_salary];\r\n    var query = N1QL('INSERT INTO test.testscope.employees VALUES ($1, {\"emp_id\":$1, \"first_name\":$2, \"last_name\":$3, \"salary\":$4})', params);\r\n    query.close();\r\n}\r\n\r\nfunction update_employee(p_emp_id, p_first_name, p_last_name, p_salary){\r\n    var params = [p_first_name, p_last_name, p_salary, p_emp_id];\r\n    var query = N1QL('UPDATE test.testscope.employees SET first_name = $1, last_name = $2, salary = $3 WHERE emp_id = $4', params);\r\n    query.close();\r\n}\r\n\r\nfunction delete_employee(p_emp_id){\r\n    var querybegin=BEGIN WORK;\r\n    var params = [p_emp_id];\r\n    var query= N1QL('DELETE FROM test.testscope.employees WHERE emp_id = $1',params);\r\n    query.close();\r\n    var querycommit=COMMIT WORK;\r\n    querycommit.close();\r\n}\r\n\r\nfunction get_employee(p_emp_id){{\r\n    var query = N1QL('SELECT first_name, last_name, salary FROM test.testscope.employees WHERE emp_id = $1', [p_emp_id]);\r\n    var rs = [];\r\n    for (\ucffc\ub9ac\uc758 const \ud589) {\r\n        rs.push(row);\r\n    }\r\n    query.close();\r\n    var p_first_name = rs[0]['first_name'];\r\n    var p_last_name = rs[0]['last_name'];\r\n    var p_salary = rs[0]['salary'];\r\n    \ubc18\ud658 {\uc774\ub984: p_first_name, \uc131: p_last_name, \uae09\uc5ec: p_salary};\r\n}\r\n\r\n<\/pre>\n<h4>\uc0c8 \uc9c1\uc6d0 \ubb38\uc11c\ub97c \uc0bd\uc785\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/h4>\n<p><span style=\"font-weight: 400;\">\uc9c1\uc6d0 \uceec\ub809\uc158\uc744 \ub9cc\ub4ed\ub2c8\ub2e4:<\/span><\/p>\n<pre class=\"nums:false wrap:true lang:default decode:true\">curl -u \uad00\ub9ac\uc790:\ube44\ubc00\ubc88\ud638 https:\/\/127.0.0.1:8091\/pools\/default\/buckets\/test\/scopes\/testscope\/collections -d \uc774\ub984=\uc9c1\uc6d0<\/pre>\n<p><span style=\"font-weight: 400;\">\uc9c1\uc6d0\uc744 \uc0bd\uc785\ud569\ub2c8\ub2e4:<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\">curl -u \uad00\ub9ac\uc790:\ube44\ubc00\ubc88\ud638 https:\/\/127.0.0.1:18093\/query\/service -d 'statement=EXECUTE FUNCTION insert_employee(1, \"joe\", \"briggs\", 10000)' -k\r\n{\r\n\"requestID\": \"2c0854c1-d221-42e9-af47-b6aa0801a46c\",\r\n\"signature\": null,\r\n\"results\": [\r\n],\r\n\"errors\": [{\"code\":10109,\"msg\":\"\ud568\uc218 'insert_employee'(blog_test:insert_employee) \uc2e4\ud589 \uc911 \uc624\ub958 \ubc1c\uc0dd\",\"reason\":{\"details\":{\"Code\":\"var query = N1QL('INSERT INTO test.testscope.employees VALUES ($1, {\\\"emp_id\\\":$1, \\\"first_name\\\":$2, \\\"last_name\\\":$3, \\\"salary\\\":$4})', params);\",\"Exception\":{\"_level\":\"exception\",\"caller\":\"insert_send:207\",\"code\":5070,\"key\":\"execution.insert_key_type_error\",\"message\":\"value.intValue \uc720\ud615\uc758 \ubb38\uc790\uc5f4\uc774 \uc544\ub2cc \ud0a4 1\uc744 \uc0bd\uc785\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.\"},\"Location\":\"functions\/blog_test.js:5\",\"Stack\":\"at insert_employee (functions\/blog_test.js:5:17)\"},\"Type\":\"JS \ucf54\ub4dc\uc5d0\uc11c \uc608\uc678\"}}],\r\n\"status\": \"\uce58\uba85\uc801\",\r\n\"metrics\": {\"elapsedTime\": \"104.172666ms\",\"executionTime\": \"104.040291ms\",\"resultCount\": 0,\"resultSize\": 0,\"serviceLoad\": 2,\"errorCount\": 1}\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">\uc774 \uc624\ub958\uac00 \ubc1c\uc0dd\ud558\uace0 <\/span><b>\uad1c\ucc2e\uc2b5\ub2c8\ub2e4.<\/b><span style=\"font-weight: 400;\"> \uc218\ub3d9\uc73c\ub85c \uc218\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uadf8 \uc774\uc720\ub97c \uc77d\uace0 <em>\uc608\uc678\uc785\ub2c8\ub2e4: <\/em><\/span><i><span style=\"font-weight: 400;\"><em>value.intValue \uc720\ud615\uc758 \ubb38\uc790\uc5f4\uc774 \uc544\ub2cc \ud0a4 1\uc744 \uc0bd\uc785\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4.<\/em>, <\/span><\/i><span style=\"font-weight: 400;\">\uc544! \ud0a4\ub294 \ud56d\uc0c1 \ubb38\uc790\uc5f4\ub85c \uc608\uc0c1\ub429\ub2c8\ub2e4. <\/span><b>insert_employee(\"1\", \"joe\", \"briggs\", 10000) <\/b><span style=\"font-weight: 400;\">\uac00 \ud6a8\uacfc\uac00 \uc788\uc744 \uac83\uc774\ub77c\uace0 \uae30\ub300\ud558\ub294 \uac83\uc740 \uc9c1\uad00\uc801\uc774\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. <em>employee_id<\/em> \ub97c \ubb38\uc790\uc5f4\ub85c \uc124\uc815\ud569\ub2c8\ub2e4.<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\">\uc0dd\uc131\ub41c \ucf54\ub4dc\ub97c \ubcc0\uacbd\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4:<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><\/p>\n<pre class=\"nums:false lang:js decode:true\">function insert_employee(p_emp_id, p_first_name, p_last_name, p_salary){{\r\n    var params = [p_emp_id.toString(), p_emp_id, p_first_name, p_last_name, p_salary];\r\n    var query = N1QL('INSERT INTO test.testscope.employees VALUES ($1, {\"emp_id\":$2, \"first_name\":$3, \"last_name\":$4, \"salary\":$5})', params);\r\n    query.close();\r\n}\r\n<\/pre>\n<p><b><\/b><span style=\"font-weight: 400;\">\uadf8\ub9ac\uace0 UDF\ub97c \ub2e4\uc2dc \uc0dd\uc131\ud569\ub2c8\ub2e4:<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\">curl -u Administrator:password https:\/\/127.0.0.1:18093\/query\/service -d 'statement=CREATE OR REPLACE FUNCTION insert_employee(p_emp_id, p_first_name, p_last_name, p_salary) \uc5b8\uc5b4 \uc790\ubc14 \uc2a4\ud06c\ub9bd\ud2b8 AS \"insert_employee\" AT \"blog_test\"' -k\r\n{\r\n\"\uc694\uccadID\": \"89df65ac-2026-4f42-8839-b1ce7f0ea2be\",\r\n\"signature\": null,\r\n\"results\": [\r\n],\r\n\"status\": \"\uc131\uacf5\",\r\n\"metrics\": {\"elapsedTime\": \"27.730875ms\",\"executionTime\": \"27.620083ms\",\"resultCount\": 0,\"resultSize\": 0,\"serviceLoad\": 2}\r\n}<\/pre>\n<p><b><\/b><b>\ub2e4\uc2dc \uc0bd\uc785\ud558\ub824\uace0 \ud569\ub2c8\ub2e4:<\/b><\/p>\n<pre class=\"nums:false lang:js decode:true\">curl -u \uad00\ub9ac\uc790:\ube44\ubc00\ubc88\ud638 https:\/\/127.0.0.1:18093\/query\/service -d 'statement=EXECUTE FUNCTION insert_employee(1, \"joe\", \"briggs\", 10000)' -k\r\n{\r\n\"requestID\": \"41fb76bf-a87f-4472-b8ba-1949789ae74b\",\r\n\"signature\": null,\r\n\"results\": [\r\nnull\r\n],\r\n\"status\": \"\uc131\uacf5\",\r\n\"metrics\": {\"elapsedTime\": \"62.431667ms\",\"executionTime\": \"62.311583ms\",\"resultCount\": 1,\"resultSize\": 4,\"serviceLoad\": 2}\r\n}\r\n<\/pre>\n<h4><span style=\"font-weight: 400;\">\uc9c1\uc6d0\uc744 \uc5c5\ub370\uc774\ud2b8\ud569\ub2c8\ub2e4:<\/span><\/h4>\n<p><span style=\"font-weight: 400;\">\uc3f4! \uc9c1\uc6d0 1\uc774 \uc870\uac00 \uc544\ub2c8\ub77c \uc5d0\ubc00\ub9ac\uc785\ub2c8\ub2e4.\u00a0<\/span><\/p>\n<p><b>\uc9c1\uc6d0 1\uc744 \uc5c5\ub370\uc774\ud2b8\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/b><b><\/b><\/p>\n<pre class=\"nums:false lang:default decode:true\">curl -u Administrator:password https:\/\/127.0.0.1:18093\/query\/service -d 'statement=EXECUTE FUNCTION update_employee(1, \"Emily\", \"Alvarez\", 10000)' -k\r\n{\r\n\"requestID\": \"92a0ca70-6d0d-4eb1-bf8d-0b4294ae987d\",\r\n\"signature\": null,\r\n\"results\": [\r\nnull\r\n],\r\n\"status\": \"\uc131\uacf5\",\r\n\"metrics\": {\"elapsedTime\": \"100.967708ms\",\"executionTime\": \"100.225333ms\",\"resultCount\": 1,\"resultSize\": 4,\"serviceLoad\": 2}\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">\uc9c1\uc6d0 \ubcf4\uae30<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\">curl -u \uad00\ub9ac\uc790:\ube44\ubc00\ubc88\ud638 https:\/\/127.0.0.1:18093\/query\/service -d 'statement=EXECUTE FUNCTION get_employee(1)' -k\r\n\r\n{\r\n\"requestID\": \"8f180e27-0028-4653-92e0-606c80d5dabb\",\r\n\"signature\": null,\r\n\"results\": [\r\n{\"first_name\":\"Emily\",\"last_name\":\"Alvarez\",\"salary\":10000}\r\n],\r\n\"status\": \"success\",\r\n\"metrics\": {\"elapsedTime\": \"101.995584ms\",\"executionTime\": \"101.879ms\",\"resultCount\": 1,\"resultSize\": 59,\"serviceLoad\": 2}\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">\uc9c1\uc6d0\uc744 \uc0ad\uc81c\ud569\ub2c8\ub2e4:<\/span><\/p>\n<p><span style=\"font-weight: 400;\">\uc5d0\ubc00\ub9ac\uac00 \ub5a0\ub0ac\uc2b5\ub2c8\ub2e4.<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\">curl -u \uad00\ub9ac\uc790:\ube44\ubc00\ubc88\ud638 https:\/\/127.0.0.1:18093\/query\/service -d 'statement=EXECUTE FUNCTION delete_employee(1)' -k\r\n\r\n{\r\n\"\uc694\uccadID\": \"18539991-3d97-40e2-bde3-6959200791b1\",\r\n\"signature\": null,\r\n\"results\": [\r\n],\r\n\"errors\": [{\"code\":10109,\"msg\":\"\ud568\uc218 'delete_employee' \uc2e4\ud589 \uc911 \uc624\ub958 \ubc1c\uc0dd (blog_test:delete_employee)\",\"reason\":{\"details\":{\"code\":\" var querycommit=N1QL('COMMIT WORK;', {}, false); \",\"Exception\":{\"_level\":\"\uc608\uc678\",\"caller\":\"txcouchbase:240\",\"cause\":{\"cause\":{\"bucket\":\"test\",\"collection\":\"_default\",\"document_key\":\"_txn:atr-988-#1b0\",\"error_description\":\"\ub0b4\uad6c\uc131 \uc694\uad6c \uc0ac\ud56d\uc744 \ub2ec\uc131\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4\",\"error_name\":\"\ub0b4\uad6c\uc131 \ubd88\uac00\ub2a5\",\"last_connection_id\":\"eda95f8c35df6746\/d275e8398a49e515\",\"last_dispatch_from\":\"127.0.0.1:50069\",\"last_dispatched_to\":\"127.0.0.1:11210\",\"msg\":\"durability impossible\",\"opaque\":7,\"scope\":\"_default\",\"status_code\":161},\"raise\":\"failed\",\"retry\":false,\"rollback\":false},\"code\":17007,\"key\":\"transaction.statement.commit\",\"message\":\"\ucee4\ubc0b \ud2b8\ub79c\uc7ad\uc158 \ubb38 \uc624\ub958\"},\"Location\":\"functions\/blog_test.js:29\",\"Stack\":\"at delete_employee (functions\/blog_test.js:29:21)\"},\"Type\":\"JS \ucf54\ub4dc\uc5d0\uc11c \uc608\uc678\"}}],\r\n\"status\": \"\uce58\uba85\uc801\",\r\n\"metrics\": {\"elapsedTime\": \"129.02975ms\",\"executionTime\": \"128.724ms\",\"resultCount\": 0,\"resultSize\": 0,\"serviceLoad\": 2,\"errorCount\": 1}\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">\ub2e4\uc2dc \uc0dd\uc131\ub41c \ucf54\ub4dc\uc5d0 \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\ub294\ub370, \uadf8 \uc774\uc720\uc640 \uc608\uc678\ub97c \uc0b4\ud3b4\ubcf4\uba74 \ubc88\uc5ed\ub41c \ucf54\ub4dc\uac00 \ud2b8\ub79c\uc7ad\uc158\uc5d0\uc11c \uc0ad\uc81c\ub97c \ud3ec\ud568\ud558\uc9c0\ub9cc \uc6d0\ubcf8\uc5d0\uc11c\ub294 \uadf8\ub807\uc9c0 \uc54a\ub2e4\ub294 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\">\ud2b8\ub79c\uc7ad\uc158\uc758 \uacbd\uc6b0 \ubc84\ud0b7\uc5d0\ub294 \ub2e4\uc74c\uc774 \ud544\uc694\ud569\ub2c8\ub2e4. <a href=\"https:\/\/docs.couchbase.com\/server\/current\/learn\/data\/durability.html\">\ub0b4\uad6c\uc131<\/a><\/span><span style=\"font-weight: 400;\">\u00a0\ub97c \uc124\uc815\ud558\ub824\uace0 \ud588\uc9c0\ub9cc \ub458 \uc774\uc0c1\uc758 \ub370\uc774\ud130 \uc11c\ubc84\uac00 \ud544\uc694\ud558\ubbc0\ub85c \uc624\ub958\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4.<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\">\uc5ec\uae30\uc11c \ud574\uacb0 \ubc29\ubc95\uc740 \ub458\ub7ec\uc2f8\ub294 \ubc88\uc5ed\uc744 \uc81c\uac70\ud558\ub3c4\ub85d \ucf54\ub4dc\ub97c \ubcc0\uacbd\ud558\ub294 \uac83\uc785\ub2c8\ub2e4:<\/span><\/p>\n<pre class=\"nums:false lang:js decode:true\">\ud568\uc218 delete_employee(p_emp_id){\r\n    var params = [p_emp_id];\r\n    var query = N1QL('DELETE FROM test.testscope.employees WHERE emp_id = $1',params);\r\n    query.close();\r\n}\r\n<\/pre>\n<pre class=\"nums:false lang:default decode:true\">curl -u \uad00\ub9ac\uc790:\ube44\ubc00\ubc88\ud638 https:\/\/127.0.0.1:18093\/query\/service -d 'statement=CREATE OR REPLACE FUNCTION delete_employee(p_emp_id) \uc5b8\uc5b4 \uc790\ubc14 \uc2a4\ud06c\ub9bd\ud2b8 AS \"delete_employee\" AT \"blog_test\"' -k\r\n\r\n{\r\n\"requestID\": \"e7432b82-1af8-4dc4-ad94-c34acea59334\",\r\n\"signature\": null,\r\n\"results\": [\r\n],\r\n\"status\": \"\uc131\uacf5\",\r\n\"metrics\": {\"elapsedTime\": \"31.129459ms\",\"executionTime\": \"31.022ms\",\"resultCount\": 0,\"resultSize\": 0,\"serviceLoad\": 2}\r\n}\r\n<\/pre>\n<pre class=\"nums:false lang:default decode:true\">curl -u \uad00\ub9ac\uc790:\ube44\ubc00\ubc88\ud638 https:\/\/127.0.0.1:18093\/query\/service -d 'statement=EXECUTE FUNCTION delete_employee(1)' -k\r\n\r\n{\r\n\"\uc694\uccadID\": \"d440913f-58ff-4815-b671-1a72b75bb7eb\",\r\n\"signature\": null,\r\n\"results\": [\r\nnull\r\n],\r\n\"status\": \"\uc131\uacf5\",\r\n\"metrics\": {\"elapsedTime\": \"33.8885ms\",\"executionTime\": \"33.819042ms\",\"resultCount\": 1,\"resultSize\": 4,\"serviceLoad\": 2}\r\n}<\/pre>\n<p><span style=\"font-weight: 400;\">\uc774\uc81c \uc6d0\ub798 PL\/SQL\uc758 \ubaa8\ub4e0 \ud568\uc218\ub294 JavaScript UDF\ub97c \ud1b5\ud574 Couchbase\uc5d0\uc11c \uc791\ub3d9\ud569\ub2c8\ub2e4. \uc608, \uc608\uc81c\ub294 \ub9e4\uc6b0 \uc0ac\uc18c\ud558\uc9c0\ub9cc \ub3c4\uad6c\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc218\ub3d9 \uac10\ub3c5\uc744 \uac70\uc758 \ud558\uc9c0 \uc54a\uace0\ub3c4 PL\/SQL \uc2a4\ud06c\ub9bd\ud2b8\ub97c \ub9c8\uc774\uadf8\ub808\uc774\uc158\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud55c \uc694\uc810\uc744 \uc54c \uc218 \uc788\uc2b5\ub2c8\ub2e4. <\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\"><br \/>\n<\/span><span style=\"font-weight: 400;\">\uc774 \ub3c4\uad6c\ub294 80%\ub97c \uc0ac\uc6a9\ud558\ub3c4\ub85d \ub418\uc5b4 \uc788\uc9c0\ub9cc \ub098\uba38\uc9c0 20%\ub294 \uc5ec\uc804\ud788 \uc0ac\uc6a9\uc790\uac00 \uc9c1\uc811 \uc218\ud589\ud574\uc57c \ud558\uc9c0\ub9cc \ubaa8\ub4e0 \ucf54\ub4dc\ub97c \uc9c1\uc811 \uc791\uc131\ud558\ub294 \uac83\ubcf4\ub2e4 \ud6e8\uc52c \ub0ab\ub2e4\ub294 \uac83\uc744 \uae30\uc5b5\ud558\uc138\uc694!<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">\ubbf8\ub798<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">\uc774 \ud504\ub85c\uc81d\ud2b8\ub294 \uc624\ud508 \uc18c\uc2a4\uc774\ubbc0\ub85c \uc790\uc720\ub86d\uac8c \uae30\uc5ec\ud574 \uc8fc\uc138\uc694. <\/span><span style=\"font-weight: 400;\">\uba87 \uac00\uc9c0 \uc544\uc774\ub514\uc5b4\uac00 \uc81c\uc548\ub418\uc5c8\uc2b5\ub2c8\ub2e4:<\/span><\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">\uc0dd\uc131\ub41c \ucf54\ub4dc\ub97c \ube44\ud3c9\ud558\uc5ec \uc218\ub3d9 \uac1c\uc785\uc774 \uc804\ud600 \ud544\uc694\ud558\uc9c0 \uc54a\ub3c4\ub85d \ud558\ub294 \ube44\ud3c9 AI<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">\ud604\uc7ac \uc18c\uc2a4 \ucf54\ub4dc\ub294 \uc791\ub3d9\ub9cc \ud558\ub294 \ucf54\ub4dc\uc774\uba70 \ubcd1\ub82c \ucc98\ub9ac\ub098 \ucf54\ub4dc \uc7ac\uc0ac\uc6a9\uc5d0 \ub300\ud55c \uace0\ub824\ub294 \uc804\ud600 \uc5c6\uc5c8\uc2b5\ub2c8\ub2e4.<\/span><\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p><span style=\"font-weight: 400;\">\ub610\ud55c \uc55e\uc11c \uc124\uba85\ud55c \uc81c\ud55c \uc0ac\ud56d\ub3c4 \ud3ec\ud568\ub429\ub2c8\ub2e4.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">\ub9ac\uc18c\uc2a4<\/span><\/h2>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li><span style=\"font-weight: 400;\"><a href=\"https:\/\/github.com\/couchbaselabs\/plsql-to-jsudf2\/releases\/tag\/v1.0.0\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ub7a9 \uae43\ud5c8\ube0c<\/a> - PL\/SQL\uc5d0\uc11c JSUDF\ub85c<\/span><\/li>\n<li><span style=\"font-weight: 400;\"><a href=\"https:\/\/www.antlr.org\/\">ANTLR<\/a> \ud30c\uc11c \uc0dd\uc131\uae30<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">\ub9c8\uc9c0\ub9c9\uc73c\ub85c \uc800\ub97c \uc548\ub0b4\ud574\uc900 \uce74\ubbf8\ub2c8 \uc790\uadf8\ud2f0\uc544\ub2c8\uc5d0\uac8c \uac10\uc0ac\uc758 \ub9d0\uc500\uc744 \uc804\ud558\uace0 \uc2f6\uc2b5\ub2c8\ub2e4. <\/span><span style=\"font-weight: 400;\">\ud53c\uc5d0\ub974 \ub808\uac00\uc870\ub2c8<\/span><span style=\"font-weight: 400;\"> \ubcc0\ud658 \ub3c4\uad6c\ub97c \ud14c\uc2a4\ud2b8\ud560 \uc218 \uc788\ub3c4\ub85d \ub3c4\uc640\uc8fc\uc168\uc2b5\ub2c8\ub2e4.<\/span><\/p>","protected":false},"excerpt":{"rendered":"<p>What is PL\/SQL? PL\/SQL is a procedural language designed specifically to embrace SQL statements within its syntax. It includes procedural language elements such as conditions and loops, and can handle exceptions (run-time errors). PL\/SQL is native to Oracle databases, and [&hellip;]<\/p>","protected":false},"author":84423,"featured_media":16851,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,2225,10133,9973,9327,1812],"tags":[10043,10090,9870,1336,1592,10089,8911],"ppma_author":[9835],"class_list":["post-16846","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-cloud","category-engineering","category-generative-ai-genai","category-javascript","category-n1ql-query","tag-developer-tools","tag-javascript-udf","tag-llms","tag-mysql","tag-oracle","tag-pl-sql","tag-udf"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>A Tool to Ease Your Transition From Oracle PL\/SQL to Couchbase JavaScript UDF - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Convert PL\/SQL to JavaScript UDFs seamlessly with an AI-powered tool. Automate Oracle PL\/SQL migration to Couchbase with high accuracy using ANTLR and LLMs.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/ko\/plsql-to-javascript-udf-conversion-tool\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"A Tool to Ease Your Transition From Oracle PL\/SQL to Couchbase JavaScript UDF\" \/>\n<meta property=\"og:description\" content=\"Convert PL\/SQL to JavaScript UDFs seamlessly with an AI-powered tool. Automate Oracle PL\/SQL migration to Couchbase with high accuracy using ANTLR and LLMs.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/ko\/plsql-to-javascript-udf-conversion-tool\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2025-02-11T16:52:20+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-07-08T16:15:37+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/02\/blog-plsql-convert-to-javascript-udf-1024x536.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"536\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Gaurav Jayaraj - Software Engineer\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Gaurav Jayaraj - Software Engineer\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/plsql-to-javascript-udf-conversion-tool\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/plsql-to-javascript-udf-conversion-tool\/\"},\"author\":{\"name\":\"Gaurav Jayaraj - Software Engineer\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/546cec92f77cbb0b09f9b973fd1c8d42\"},\"headline\":\"A Tool to Ease Your Transition From Oracle PL\/SQL to Couchbase JavaScript UDF\",\"datePublished\":\"2025-02-11T16:52:20+00:00\",\"dateModified\":\"2025-07-08T16:15:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/plsql-to-javascript-udf-conversion-tool\/\"},\"wordCount\":1605,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/plsql-to-javascript-udf-conversion-tool\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/02\/blog-plsql-convert-to-javascript-udf.png\",\"keywords\":[\"developer tools\",\"javascript UDF\",\"LLMs\",\"mysql\",\"oracle\",\"pl\/sql\",\"User Defined Function (UDF)\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Couchbase Capella\",\"Engineering\",\"Generative AI (GenAI)\",\"JavaScript\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/plsql-to-javascript-udf-conversion-tool\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/plsql-to-javascript-udf-conversion-tool\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/plsql-to-javascript-udf-conversion-tool\/\",\"name\":\"A Tool to Ease Your Transition From Oracle PL\/SQL to Couchbase JavaScript UDF - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/plsql-to-javascript-udf-conversion-tool\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/plsql-to-javascript-udf-conversion-tool\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/02\/blog-plsql-convert-to-javascript-udf.png\",\"datePublished\":\"2025-02-11T16:52:20+00:00\",\"dateModified\":\"2025-07-08T16:15:37+00:00\",\"description\":\"Convert PL\/SQL to JavaScript UDFs seamlessly with an AI-powered tool. Automate Oracle PL\/SQL migration to Couchbase with high accuracy using ANTLR and LLMs.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/plsql-to-javascript-udf-conversion-tool\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/plsql-to-javascript-udf-conversion-tool\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/plsql-to-javascript-udf-conversion-tool\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/02\/blog-plsql-convert-to-javascript-udf.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/02\/blog-plsql-convert-to-javascript-udf.png\",\"width\":2400,\"height\":1256,\"caption\":\"A tool for converting PL\/SQL to JavaScript UDF (JSUDF) using LLMs\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/plsql-to-javascript-udf-conversion-tool\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"A Tool to Ease Your Transition From Oracle PL\/SQL to Couchbase JavaScript UDF\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/546cec92f77cbb0b09f9b973fd1c8d42\",\"name\":\"Gaurav Jayaraj - Software Engineer\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/a332e5d7f47865015367ca88af3e5891\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/02\/unnamed-2.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/02\/unnamed-2.jpg\",\"caption\":\"Gaurav Jayaraj - Software Engineer\"},\"description\":\"Gaurav Jayaraj is an intern in the Query team at Couchbase R&amp;D. Gaurav is pursuing his Bachelors in Computer Science from PES University, Bangalore.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/ko\/author\/gauravjayaraj\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"A Tool to Ease Your Transition From Oracle PL\/SQL to Couchbase JavaScript UDF - The Couchbase Blog","description":"AI \uae30\ubc18 \ub3c4\uad6c\ub85c PL\/SQL\uc744 JavaScript UDF\ub85c \uc6d0\ud65c\ud558\uac8c \ubcc0\ud658\ud558\uc138\uc694. ANTLR \ubc0f LLM\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub192\uc740 \uc815\ud655\ub3c4\ub85c \uc624\ub77c\ud074 PL\/SQL\uc744 Couchbase\ub85c \ub9c8\uc774\uadf8\ub808\uc774\uc158\ud558\uc138\uc694.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/ko\/plsql-to-javascript-udf-conversion-tool\/","og_locale":"ko_KR","og_type":"article","og_title":"A Tool to Ease Your Transition From Oracle PL\/SQL to Couchbase JavaScript UDF","og_description":"Convert PL\/SQL to JavaScript UDFs seamlessly with an AI-powered tool. Automate Oracle PL\/SQL migration to Couchbase with high accuracy using ANTLR and LLMs.","og_url":"https:\/\/www.couchbase.com\/blog\/ko\/plsql-to-javascript-udf-conversion-tool\/","og_site_name":"The Couchbase Blog","article_published_time":"2025-02-11T16:52:20+00:00","article_modified_time":"2025-07-08T16:15:37+00:00","og_image":[{"width":1024,"height":536,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/02\/blog-plsql-convert-to-javascript-udf-1024x536.png","type":"image\/png"}],"author":"Gaurav Jayaraj - Software Engineer","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Gaurav Jayaraj - Software Engineer","Est. reading time":"8\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/plsql-to-javascript-udf-conversion-tool\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/plsql-to-javascript-udf-conversion-tool\/"},"author":{"name":"Gaurav Jayaraj - Software Engineer","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/546cec92f77cbb0b09f9b973fd1c8d42"},"headline":"A Tool to Ease Your Transition From Oracle PL\/SQL to Couchbase JavaScript UDF","datePublished":"2025-02-11T16:52:20+00:00","dateModified":"2025-07-08T16:15:37+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/plsql-to-javascript-udf-conversion-tool\/"},"wordCount":1605,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/plsql-to-javascript-udf-conversion-tool\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/02\/blog-plsql-convert-to-javascript-udf.png","keywords":["developer tools","javascript UDF","LLMs","mysql","oracle","pl\/sql","User Defined Function (UDF)"],"articleSection":["Best Practices and Tutorials","Couchbase Capella","Engineering","Generative AI (GenAI)","JavaScript","SQL++ \/ N1QL Query"],"inLanguage":"ko-KR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/plsql-to-javascript-udf-conversion-tool\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/plsql-to-javascript-udf-conversion-tool\/","url":"https:\/\/www.couchbase.com\/blog\/plsql-to-javascript-udf-conversion-tool\/","name":"A Tool to Ease Your Transition From Oracle PL\/SQL to Couchbase JavaScript UDF - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/plsql-to-javascript-udf-conversion-tool\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/plsql-to-javascript-udf-conversion-tool\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/02\/blog-plsql-convert-to-javascript-udf.png","datePublished":"2025-02-11T16:52:20+00:00","dateModified":"2025-07-08T16:15:37+00:00","description":"AI \uae30\ubc18 \ub3c4\uad6c\ub85c PL\/SQL\uc744 JavaScript UDF\ub85c \uc6d0\ud65c\ud558\uac8c \ubcc0\ud658\ud558\uc138\uc694. ANTLR \ubc0f LLM\uc744 \uc0ac\uc6a9\ud558\uc5ec \ub192\uc740 \uc815\ud655\ub3c4\ub85c \uc624\ub77c\ud074 PL\/SQL\uc744 Couchbase\ub85c \ub9c8\uc774\uadf8\ub808\uc774\uc158\ud558\uc138\uc694.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/plsql-to-javascript-udf-conversion-tool\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/plsql-to-javascript-udf-conversion-tool\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/plsql-to-javascript-udf-conversion-tool\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/02\/blog-plsql-convert-to-javascript-udf.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/02\/blog-plsql-convert-to-javascript-udf.png","width":2400,"height":1256,"caption":"A tool for converting PL\/SQL to JavaScript UDF (JSUDF) using LLMs"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/plsql-to-javascript-udf-conversion-tool\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"A Tool to Ease Your Transition From Oracle PL\/SQL to Couchbase JavaScript UDF"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ube14\ub85c\uadf8","description":"NoSQL \ub370\uc774\ud130\ubca0\uc774\uc2a4, Couchbase","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ube14\ub85c\uadf8","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/546cec92f77cbb0b09f9b973fd1c8d42","name":"\uac00\uc6b0\ub77c\ube0c \uc790\uc57c\ub77c\uc988 - \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc5d4\uc9c0\ub2c8\uc5b4","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/a332e5d7f47865015367ca88af3e5891","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/02\/unnamed-2.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/02\/unnamed-2.jpg","caption":"Gaurav Jayaraj - Software Engineer"},"description":"\uac00\uc6b0\ub77c\ube0c \uc790\uc57c\ub77c\uc988\ub294 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4 R&amp;D\uc758 \ucffc\ub9ac \ud300\uc5d0\uc11c \uc778\ud134\uc73c\ub85c \uadfc\ubb34\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. Gaurav\ub294 \ubc29\uac08\ub85c\ub974\uc758 PES \ub300\ud559\uc5d0\uc11c \ucef4\ud4e8\ud130 \uacf5\ud559 \ud559\uc0ac \ud559\uc704\ub97c \ucde8\ub4dd\ud588\uc2b5\ub2c8\ub2e4.","url":"https:\/\/www.couchbase.com\/blog\/ko\/author\/gauravjayaraj\/"}]}},"authors":[{"term_id":9835,"user_id":84423,"is_guest":0,"slug":"gauravjayaraj","display_name":"Gaurav Jayaraj - Software Engineer","avatar_url":{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/02\/unnamed-2.jpg","url2x":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2025\/02\/unnamed-2.jpg"},"author_category":"","last_name":"Jayaraj - Software Engineer","first_name":"Gaurav","job_title":"","user_url":"","description":"\uac00\uc6b0\ub77c\ube0c \uc790\uc57c\ub77c\uc988\ub294 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4 R&amp;D\uc758 \ucffc\ub9ac \ud300\uc5d0\uc11c \uc778\ud134\uc73c\ub85c \uadfc\ubb34\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. Gaurav\ub294 \ubc29\uac08\ub85c\ub974\uc758 PES \ub300\ud559\uc5d0\uc11c \ucef4\ud4e8\ud130 \uacf5\ud559 \ud559\uc0ac \ud559\uc704\ub97c \ucde8\ub4dd\ud588\uc2b5\ub2c8\ub2e4."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/16846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/users\/84423"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/comments?post=16846"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/16846\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media\/16851"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media?parent=16846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/categories?post=16846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/tags?post=16846"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/ppma_author?post=16846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}